【问题标题】:Regex multiple matches on multiple lines多行上的正则表达式多个匹配
【发布时间】:2015-04-14 00:31:49
【问题描述】:

我有这个数据,实际上是一个降价表:

blah blah blah
| Tables        | Are           | Cool  |
| ------------- |:-------------:| -----:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |
blah blah
blah

我想做一个正则表达式匹配并取出管道之间的值。

理想情况下,我想为每行创建一个组,然后为每个“单元格”创建一个子组。

更理想的是,我想确保每行中有相同数量的单元格/列。

我的尝试要么匹配行/表中的最后一个单元格,要么每隔一个单元格匹配一次。这完全炸毁了: \|(?:([^\r\n\|]*)\|)+\r?\n\|(?:(\:?-+\:?)\|)+\r?\n(\|(?:([^\r\n\|]*)\|)+\r?\n)+

这也很惨:^#(?:([^#]+)#)+$

正在寻找 javascript 或 C# 中的解决方案。

【问题讨论】:

  • 输入的是单个字符串吗?

标签: javascript c# regex


【解决方案1】:

我会用这样的东西进入js,但前提是你不需要正则表达式来做其他事情;-)

var yourStr
var groups = yourStr.split('\n')
var cells = yourStr.split('|')
if (cells.length < asItShouldBe) { ... }
var cell1 = cells[1]
var cell2 = cells[2]
...

【讨论】:

    【解决方案2】:

    试试

    var input = document.querySelectorAll("pre")[0].innerText;
    var output = input.match(/\s+|\w+-\w+|\w+|\W+\d+|\d+/gi)
                 .map(function(word, i) {
                   return word.replace(/\||\s|--+|\s-\s+|:/gi, "")
                 });
    
    document.body.insertBefore(
      document.createTextNode(output.join(" "))
    , document.getElementsByTagName("hr")[0]
    );
    <hr />
    <pre>
    blah blah blah
    | Tables        | Are           | Cool  |
    | ------------- |:-------------:| -----:|
    | col 3 is      | right-aligned | $1600 |
    | col 2 is      | centered      |   $12 |
    | zebra stripes | are neat      |    $1 |
    blah blah
    blah
    </pre>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多