2016-07-08 211 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