在PCRE中模拟未知宽度的负回顾后断言。

3
我有以下正则表达式
(?<=:)\s*\w+

我希望您只提取字符串中的comp comp
savedPosition: comp;
CURLSCHET.NREC ('qwertyuiop'): noprotect;

我希望避免在所需模式之前有任何()的情况下匹配类似noprotect的情况。

只是为了明确一下:您有一个多行字符串,想要匹配不包含 () 的特定单词吗?此外,您真的也想获取空匹配吗?我认为您需要使用 \w+ 而不是 \w* - Wiktor Stribiżew
如果这一行是 : noprotect; (word),你想要提取出 noprotect 吗?当整行不应包含 () 时,解决方案将有所不同,而当在一行中的 word 前面没有 () 时,也会有所不同。 - Wiktor Stribiżew
Wiktor Stribiżew,在第一条评论中提供的提示非常感谢。是的,如果该行是 : noprotect; (word),我想提取 noprotect - skaborik
1
这真是让人崩溃,因为我实际上并不知道所有的细节。尝试使用(?m)(?:^|\G)[^()\n]*?:\h*\K\w+ - 这将获取一行中第一个()之前的多个匹配项。 - Wiktor Stribiżew
1
Wiktor Stribiżew,看起来它运行正常。谢谢! - skaborik
显示剩余2条评论
3个回答

0
你应该试一下这个:
[^\(\):]*:\s*(\w*)

解释:

  1. [^\(\):]*: 捕获除了 ( 和 ) 以及 : 之外的所有内容
  2. : 后跟 :
  3. \s* 后跟零个或多个空格字符
  4. \w* 后跟零个或多个长度的单词

演示

另一种方法:

如果您不想匹配前面的部分,也可以尝试这个解决方案:

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

备选演示


你的第一个模式是个好主意,只是需要一个行首锚点。(?m)^[^():]*:\h*\K\w+ - Casimir et Hippolyte

0

PCRE不支持未知宽度的负向后顾(.NET支持,它会在那里看起来像这样),但是你可以使用\G\K运算符的组合以及否定字符类[^()]的帮助,在第一个()之前提取每行上的所有匹配。

您可以使用

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

查看正则表达式演示

详情

  • (?m) - 开启多行模式
  • (?:^|\G) - 匹配字符串/行的开头或上一个匹配的结尾
  • [^()\n]*? - 任何0个或多个字符,但不包括(, )和换行符,尽可能少地匹配
  • : - 冒号
  • \h* - 0个或多个水平空格
  • \K - 匹配重置操作符,丢弃到目前为止匹配的所有文本
  • \w+ - 1个或多个单词字符。

0

: *\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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接