仿效未知宽度的负回顾后在PCRE

问题描述:

我有following regex仿效未知宽度的负回顾后在PCRE

(?<=:)\s*\w+ 

我想只从字符串提取compcomp

savedPosition: comp; 
CURLSCHET.NREC ('qwertyuiop'): noprotect; 

我想避免匹配情况下,像noprotect当有()之前的任何地方所需的模式。

+0

只是要想清楚:你有一个多行字符串,你想匹配不包含'('和')'行特定的词?另外,你是否真的想获得空的比赛呢?我认为你需要'\ w +',而不是'\ w *'。 –

+0

如果该行是':noprotect; (word)',你想提取'noprotect'吗?对于整行不应包含'('和')',并且在一行上的'word'前面不应该有'('和')''的情况,解决方案将会不同。 –

+0

WiktorStribiżew,感谢您在第一条评论的提示。 是的,我想提取'noprotect'如果行是':noprotect; (word)' – skaborik

未知宽度负回顾后不被PCRE(.NET做,它看起来like this有)的支持,但你可以在第一()之前使用的\G\K运营商的组合提取物对每一行的所有比赛可以匹配任何字符但是()的否定字符类别[^()]的帮助。

您可以使用

(?m)(?:^|\G)[^()\n]*?:\h*\K\w+ 

regex demo

详细

  • (?m) - 上
  • MULTILINE模式
  • (?:^|\G) - 串/线路或结束的比赛开始前一场比赛的成绩是
  • [^()\n]*? - 任何0+字符超过()和换行等,尽可能少
  • : - 冒号
  • \h* - 0+水平空格
  • \K - 匹配复位操作,它放弃所有文本匹配到目前为止
  • \w+ - 1个或更多字词。

你应该试试这个,然后:

[^\(\):]*:\s*(\w*) 

说明:

  1. [^\(\):]*:捕捉一切,没有(和(和:
  2. :通过folowed:
  3. \s*其次由零个或多个空白字符组成
  4. \w*其次是零或多个字长度

Demo

备选:

如果你不想前面部分匹配,那么你也可以尝试这种解决方案:

^(?=[^\(\):]*:).*:\s*\K(\w*) 

Alternative Demo

+0

你的第一个模式是一个好主意,除了需要一个行锚的开始。 '(M +)^ [^():] *:\ H * \ķ\ W +' –

: *\K\w+

: matches the character : literally (case sensitive) 
* 
matches the character literally (case sensitive) 
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
\K resets the starting point of the reported match. Any previously consumed characters are no longer included in the final match 
\w+ 
matches any word character (equal to [a-zA-Z0-9_]) 
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)