【问题标题】:Perl Regex "Not" (negative lookahead)Perl 正则表达式“非”(负前瞻)
【发布时间】:2012-04-04 00:12:31
【问题描述】:

我不太确定这种正则表达式的正确措辞是什么,但基本上我想要做的是匹配任何以“/”开头但后面没有“bob/”的字符串,举个例子。

所以这些会匹配:

/tom/
/tim/
/steve

但这些不会

tom
tim
/bob/

我确信答案非常简单,但我很难在任何地方搜索“regex not”。我敢肯定有一个更好的词来表示我想要的会带来好的结果,但我不确定它会是什么。

编辑:我已更改标题以指明我正在寻找的正确名称

【问题讨论】:

  • /jimbob/ 呢? /bob/apples呢?
  • 对我来说 /jimbob/ 没问题,但 /bob/apples 不是

标签: regex perl regex-lookarounds


【解决方案1】:

您可以使用负前瞻(在"Extended Patterns" in perlre 下记录):

/^\/(?!bob\/)/

【讨论】:

  • 可能是 /^\/(?!bob\/)/ ,但你明白了它的要点。谢谢!
  • @GoldenNewby Woops,忽略了这部分问题
  • 现在有了默认的正则表达式标志,^ 最好写成\A。使用备用分隔符和/x,它看起来像m| \A / (?!bob/) |x
  • @brian d foy,建议存在此功能意味着 /^/ 必须更改为 /\A//$//(?=\n?\z)//.//[^\n]// //[ ]/.
  • @ikegami: $ 应该经常是\z 无论如何;我并非没有理由使用并行\A
【解决方案2】:

TLDR:负前瞻

如果您想要一个否定的前瞻只是为了找到"foo" 而它后面没有"bar"...

$string =~ m/foo(?!bar)/g;

Working Demo Online

来源

引用文档...

(?!pattern)

(*nla:pattern)

#(*negative_lookahead:pattern)

一个零宽度的负前瞻断言。例如,/foo(?!bar)/ 匹配任何出现的“foo”,但后面没有“bar”。但是请注意,lookahead 和lookbehind 不是一回事。您不能将其用于后视。 (来源:PerlDocs。)

您的案例的负面预测

接受的答案很好,但没有留下任何解释,所以让我添加一个......

/^\/(?!bob\/)/
  • ^ — 仅匹配字符串的开头。
  • \/ — 匹配 / 字符,我们需要对其进行转义,因为它是正则表达式格式的字符(即 s/find/replacewith/ 等)。
  • (?!...) — 如果匹配后面跟着...,则不匹配。
  • bob\/ — 这是 ... 值,不匹配 bob/', once more, we need to escape the /`。

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多