【问题标题】:How to negate perl regex with lookbehind?如何用lookbehind否定perl正则表达式?
【发布时间】:2020-10-17 09:08:33
【问题描述】:

我要检查此文本 (file.txt):

_abcd
_efgh
#, _1

现在我只想匹配带有下划线但前面没有哈希# 的单词。万事俱备,我能做到

$perl -nle 'print $1 if /(_\w+)/' file.txt

但我不想匹配哈希,所以我会尝试后向:

$ perl -nle 'print $1 if /(?<!#.+)(_\w+)/' file.txt

Variable length lookbehind not implemented in regex m/(?<!#.+)(_\w+)/ at -e line 1.
  1. 如何在perl中实现变长lookbehind?

第二个,我会尝试先行:

$ perl -nle 'print $1 if /(?!#.+)(_\w+)/' file.txt

这将再次匹配所有内容,包括我不想要的 # 行。

  1. 如何匹配所有,除了# 行(换句话说,如何否定正则表达式)?

【问题讨论】:

  • 试试/#.+(*SKIP)(*F)|\b_\w+/
  • 或者^(?!.*#).*(_\w+)
  • @WiktorStribiżew 你能解释一下吗?不知道(*SKIP)(*F) 是什么意思,因为它解决了问题,但我不知道这个正则表达式变量
  • @JvdV,_foo # bar 失败

标签: regex perl regex-lookarounds regex-negation


【解决方案1】:

你可以使用

/#.+(*SKIP)(*F)|_\w+/

或者,在单词边界匹配_

/#.+(*SKIP)(*F)|\b_\w+/

模式匹配

  • #.+(*SKIP)(*F) - # 和任何1个或多个除换行符以外的字符尽可能多,然后匹配被跳过,省略,丢弃,并从匹配被跳过的地方搜索下一个匹配李>
  • | - 或
  • _\w+ - _,然后是任何 1 个或多个单词字符。

【讨论】:

  • 所以“丢弃”是通过(*SKIP) 进行的,而(*F) 是为了“从那一点继续”?或者(*F) 做什么?
  • @milanHrabos (*SKIP)(*FAIL) 像这样工作,跳过匹配的文本,(*F) / (*FAIL) 导致立即失败。
  • 都在perlre
  • @milanHrabos 还有,(*F)/(*FAIL)可以换成(?!),也会导致使用的地方出现故障。
【解决方案2】:

以下会做:

/^[^#]*(_\w+)/

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2012-02-08
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2013-07-23
    相关资源
    最近更新 更多