2016-07-08 162 views
2

我有正则表达式的简单问题,但我没有想法解决它们。我有串(灰色,这是一个标签):正则表达式组匹配空间

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忽略,b因为有空间并被带到第二场比赛。我想在第二次匹配到下一个“标签”或结束行后插入第一个匹配标签(带空白或不带空格),冒号和任何东西(带空格)。

有什么建议吗?

回答

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+其他任何chararacter比换行符尽可能少到第一...
  • (?=$|\s+(?:aaa aa|bbbb|cccc)) - (其限制了.*?匹配的正超前)
    • $ - ... STRI的端NG
    • | - 或...
    • \s+ - 一个或多个空格,接着用......
      • (?:aaa aa|bbbb|cccc) - 任何三个备选方案(仅用于分组,而不是捕捉非捕获组内的)
+0

这很好,我认为这并不是一个简单的解决方案。但我从来不明白,是什么意思('?='$ | \ s + – Peter

0

好所以这会做你想要什么

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

但是,它是高度人为设计的,给出了这个问题。

+0

但是在链接到regex101时,我忘记了'ddd ddd' – Peter

+0

之间的空间啊好吧,积极的lookahead解决方案总是优越 – lps

0

如果你试图得到公正的标签(即使该键有一个空格),这里的东西我很快就输入了:https://regex101.com/r/jJ9iI1/3

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

它开始与^\s(开头或空间字符)。然后它简单地捕获导致冒号的每个字符(冒号除外)。

...确保g为全球打开

+0

但我需要pair:label并在结果中的值 – Peter

+0

不知道我完全理解。捕获值是同样的东西,只是把冒号放在第一位。顺便说一句,我只是注意到我的原始解决方案应该有一个非捕获或开始......(?:^| \ s)([^:] +): –

+0

我认为您的解决方案需要开发https://regex101.com/r/jJ9iI1/4,但感谢您的灵感 – Peter