正则表达式,它可以找到匹配组的次数

时间:2016-05-09 11:41:35

标签: javascript regex regex-greedy

我编写了一个正则表达式来匹配一些看起来像这样的标签:

@("hello, world" bold italic font-size="15")

我希望正则表达式匹配这些字符串:['hello, world', 'bold', 'italic', 'font-size="15"']

但是,只匹配这些字符串:['hello, world', 'font-size="15"']

其他例子:

  1. (成功)@("test") -> ["test"]
  2. (成功)@("test" bold) -> ["test", "bold"]
  3. (失败)@("test" bold size="15") -> ["test", "bold", 'size="15"']
  4. 我尝试过使用这个正则表达式:

    \@\(\s*"((?:[^"\\]|\\.)*)"(?:\s+([A-Za-z0-9-_]+(?:\="(?:[^"\\]|\\.)*")?)*)\s*\)
    

    细分版本:

    \@\(
      \s*
      "((?:[^"\\]|\\.)*)"
      (?:
        \s+
        (
          [A-Za-z0-9-_]+
          (?:
            \=
            "(?:[^"\\]|\\.)*"
          )?
        )
      )*
      \s*
    \)
    

    正则表达式正在尝试

    1. 匹配序列的开头($(),
    2. 匹配带有转义字符的字符串
    3. 匹配一些(> = 1)空白,
    4. (可选,与(5)分组)匹配=符号
    5. (可选,与(4)分组)匹配带有转义字符的字符串
    6. 重复(3) - (5)
    7. 匹配序列的末尾()
    8. 但是,此正则表达式仅匹配"hello, world"font-size="15"。如何使其与bolditalic匹配,即多次匹配群组([A-Za-z0-9-_]+(?:\="(?:[^"\\]|\\.)*")?)

      预期结果:['"hello, world"', 'bold', 'italic', 'font-size="15']

      P.S。使用JavaScript本机正则表达式

1 个答案:

答案 0 :(得分:2)

您需要一个两步解决方案:

示例代码:

var re = /@\((?:\s*(?:"[^"\\]*(?:\\.[^"\\]*)*"|[\w-]+(?:="?[^"\\]*(?:\\.[^"\\]*)*"?)?))+\s*\)/g; 
var re2 = /(?:"([^"\\]*(?:\\.[^"\\]*)*)"|[\w-]+(?:="?[^"\\]*(?:\\.[^"\\]*)*"?)?)/g;
var str = 'Text here @("hello, world" bold italic font-size="15") and here\nText there @("Welcome home" italic font-size="2345") and there';
var res = [];

while ((m = re.exec(str)) !== null) {
    tmp = [];
    while((n = re2.exec(m[0])) !== null) {
      if (n[1]) {
        tmp.push(n[1]);
      } else {
        tmp.push(n[0]);
      }
    }
    res.push(tmp);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";