正则表达式匹配单词后的内容

3
我想知道如何仅在一行开头匹配特定字符串的情况下捕获文本,但我不想捕获开头的字符串...
例如,如果我有以下文本:
BEGIN_TAG:要捕获的文本 WRONG_TAG:不需要捕获的文本
我想捕获的是: 要捕获的文本
从以BEGIN_TAG开头的行中获取:而不是以WRONG_TAG开头的行。
我知道如何选择以所需文本开头的行:^BEGIN_TAG:\W?(.*)
但这将选择文本“BEGIN_TAG:”...我只想要“BEGIN_TAG”后面的文本。
我正在使用PCRE正则表达式。

尝试使用非捕获组,表示为 (?:) - Eli Sadoff
1
你说的“selects”是什么意思?你将文本捕获到Group 1中。它已经在那里了。你只需要访问Group 1的内容就可以了。这是PHP吗?看一下demo - Wiktor Stribiżew
这是关于编程的内容,需要将其从英语翻译成中文。请仅返回已翻译的文本:这不是PHP,而是在SublimeText中。通过“selects”,我指的是我希望文本位于我的捕获组中。 - user254340
1
@melpomene 当然没错。所以你得到 (?<=^BEGIN_TAG:\W)(.*)$,如果你还想匹配文本后面没有非单词字符的情况,你还需要 (?<=^BEGIN_TAG:)(.*)$ - user1544337
Camil Staps,我该如何将您的评论选为解决方案? - user254340
显示剩余6条评论
2个回答

4

如果不能使用未知宽度模式的正向后瞻,您可以使用匹配重置运算符\K:

^BEGIN_TAG:\W?\K.*

请查看正则表达式演示

细节:

  • ^ - 在 Sublime 中,表示行首
  • BEGIN_TAG: - 一串字面字符
  • \W? - 匹配一个或零个非单词字符
  • \K - 被称为匹配重置运算符的操作符,它会清空已匹配文本,并重新开始匹配。
  • .* - 匹配零个或多个非换行符字符(一行中其余的字符都将保留在匹配的文本中)。

2
您可以使用回顾。然后,回顾组中的文本不是整个匹配的一部分。您可以将其视为锚点,例如\b^等。

然后您会得到:

(?<=^BEGIN_TAG:\W)(\w.*)$

解释:
(?<=             # Positive lookbehind group
    ^            # Start of line / string
    BEGIN_TAG:   # Literal
    \W           # A non-word character ([^a-zA-Z_])
)
(                # First and only matching group (probably not needed)
    \w           # A word character ([a-zA-Z_])
    .*           # Any character, any number of times
)
$                # End of line / string

1
现在,为了支持可选的\W,您将不得不使用后顾替换:(?:(?<=^BEGIN_TAG:\W)|(?<=^BEGIN_TAG:))(\w.*)$。这就是为什么如果原始模式应完全考虑,则使用\K更可取的原因。 - Wiktor Stribiżew

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