正则表达式组与空间匹配

时间:2016-07-08 21:44:36

标签: javascript regex

我有正则表达式的简单问题,但我不知道解决它们。我有字符串(灰色这是一个标签):

  

cccc:ddddd bbbb:fgggg aaa aa:ddd ddd cccc:ggggggg

和正则表达式

/(aaa aa|bbbb|cccc)+:([\sa-zA-Z]*)(?:$|\s)/ig

https://regex101.com/r/mR3vK5/1

解析字符串'label'aaa aa后忽略,因为有空格并被带到第二个匹配。我希望在插入第二个匹配到下一个“标签”或结束行之后先做匹配标签(带或不带空格),冒号和任何东西(带空格)。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

如果您知道所有键,您可以在正向前瞻中使用它们,并将值与延迟点匹配:

/(aaa aa|bbbb|cccc):(.*?)(?=$|\s+(?:aaa aa|bbbb|cccc))/gi

参见JS演示:

var block = "aaa aa|bbbb|cccc";
var rx = RegExp("(" + block + "):(.*?)(?=$|\\s+(?:" + block + "))", "ig");
var s = "cccc:ddddd bbbb:fgggg aaa aa:ddd ddd cccc:ggggggg";
while ((m = rx.exec(s)) !== null) {
    document.body.innerHTML += m[1] + ": " + m[2] + "<br/>";
}

模式说明

  • (aaa aa|bbbb|cccc) - aaa aabbbbcccc
  • : - 字面冒号
  • (.*?) - 第2组匹配0 +除换行之外的任何字符尽可能少到第一个......
  • (?=$|\s+(?:aaa aa|bbbb|cccc)) - (限制.*?匹配的正向前瞻)
    • $ - ...字符串结尾
    • | - 或......
    • \s+ - 一个或多个空格后跟......
      • (?:aaa aa|bbbb|cccc) - 三种替代方案中的任何一种(在非捕获组中,仅用于分组,不捕获)

答案 1 :(得分:0)

那么这将做你想做的事情

/(aaa aa|bbbb|cccc)+:(\s*[a-zA-Z]*)(?:$|\s)/ig

但是,考虑到这个问题,它是非常人为的。

答案 2 :(得分:0)

如果您只是想获得标签(即使密钥有空格),请按以下方式快速输入:https://regex101.com/r/jJ9iI1/3

(?:^|\s)([^:]+):

它以^\s(开头或空格字符)开头。然后它只是捕获每个字符(除了冒号),直到结肠。

...确保全局g已开启