是否可以匹配行首的字符串,但只用正则表达式捕获结尾?

Is it possible to match string at the beginning of line, but only capture the end with regex?

我有这样的文字:

[G&]120948103471390857102349871[002]
[A&]512903451029349012390409232[002]
[2&]512903451029349012390409232[002]

我只想匹配以 [G&] 开头的第一行的 [002],但不匹配其他内容。

它将在 "syntax match" 上用于 vim 语法突出显示。

以下应该可以解决问题:

\[G&].*(\[.*])

Here's 演示。

[002]" 位将在正则表达式的第一个捕获组中可用。

依次解释正则表达式中的每一项:

  • \[G&] - 我们需要转义开头 [ 因为它是正则表达式中的特殊字符,然后我们匹配字符 G 后跟 &] 个字符。
  • .* - 零个或多个其他字符。
  • (\[.*]) - 我们匹配左方括号(再次转义)\[ 后跟零个或多个任何其他字符 .* 后跟右方括号 ].这是我们用括号括起来表示我们要 capture a group.

您可能正在寻找前瞻性

^(?=\[G&\]).+(\[\d+\])\s*$

参见 regex101.com 上的 a working demo。此外,您的演示字符串中有尾随空格,它们是故意的吗?

经过更长时间的谷歌搜索后,我发现 vim 正则表达式具有不同的 lookahead/lookbehind。

这里是:

\(G&.*\)\@<=\(\[\d\d\d\]$\)