如何用 lookbehind 否定 perl 正则表达式?

How to negate perl regex with lookbehind?

我有这段文字(file.txt)要检查:

_abcd
_efgh
#, _1

现在我只想匹配带有下划线但前面没有散列 # 的单词。全部搞定,我能做到

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

但是我不想匹配hash,所以我会尝试lookbehind:

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

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

对于第二个,我会尝试做前瞻:

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

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

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

您可以使用

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

或者,在单词边界处匹配 _

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

模式匹配

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

执行以下操作:

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