【问题标题】:regex match after word单词后的正则表达式匹配
【发布时间】:2016-11-21 20:37:02
【问题描述】:

我想知道如何仅在行首匹配某个字符串时捕获文本...但我不想捕获开始字符串...

例如,如果我有文字:

BEGIN_TAG:要捕获的文本

WRONG_TAG:不可捕捉的文字

我想捕捉:

要捕获的文本

从以 BEGIN_TAG 开头的行:不是以 WRONG_TAG 开头的行:

我知道如何选择以所需文本开头的行:^BEGIN_TAG:\W?(.*)

但是这会选择文本“BEGIN_TAG:”...我不希望它只想要“BEGIN_TAG”之后的文本

我正在使用 PCRE 正则表达式

【问题讨论】:

  • 尝试使用(?:)表示的非捕获组。
  • “选择”是什么意思?您将文本捕获到第 1 组。它已经存在。您需要做的就是访问第 1 组的内容。是PHP吗?看看demo
  • 它不是 PHP 而是 sublimetext。 “选择”是指我希望文本在我的捕获组中
  • Sublime 是否支持lookbehind? (?<=^BEGIN_TAG:\W*)(\w.*)$
  • @melpomene 当然是对的。所以(?<=^BEGIN_TAG:\W)(.*)$你得到了,如果你还想在文本后面直接匹配没有非单词字符,你还需要(?<=^BEGIN_TAG:)(.*)$

标签: regex pcre


【解决方案1】:

您可以使用lookbehind。然后,lookbehind 组中的文本不是整个匹配的一部分。您可以将其视为\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

【讨论】:

  • 现在,要支持可选的\W,您必须使用交替的lookbehinds:(?:(?&lt;=^BEGIN_TAG:\W)|(?&lt;=^BEGIN_TAG:))(\w.*)$。这就是为什么如果应该充分考虑原始模式,最好使用\K
【解决方案2】:

您可以使用匹配重置运算符\K

^BEGIN_TAG:\W?\K.*

regex demo

详情

  • ^ - 在 Sublime 中,一行的开始
  • BEGIN_TAG: - 一串文字字符
  • \W? - 1 或 0 个非单词字符
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • .* - 除了换行符(行的其余部分)之外的任何 0+ 个字符,这些字符是匹配文本中唯一保留的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多