如何用 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.
- 如何在 perl 中实现变长回顾?
对于第二个,我会尝试做前瞻:
$ perl -nle 'print if /(?!#.+)(_\w+)/' file.txt
这将再次匹配所有内容,包括我不想要的 #
行。
- 如何匹配所有,除了
#
行(换句话说,如何否定正则表达式)?
您可以使用
/#.+(*SKIP)(*F)|_\w+/
或者,在单词边界处匹配 _
:
/#.+(*SKIP)(*F)|\b_\w+/
模式匹配
#.+(*SKIP)(*F)
- #
和除换行字符外的任何1个或多个字符尽可能多,然后跳过,省略,丢弃匹配并从中搜索下一个匹配跳过比赛的地方
|
- 或
_\w+
- 一个 _
然后是任何 1 个或多个单词字符。
执行以下操作:
/^[^#]*(_\w+)/
我有这段文字(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.
- 如何在 perl 中实现变长回顾?
对于第二个,我会尝试做前瞻:
$ perl -nle 'print if /(?!#.+)(_\w+)/' file.txt
这将再次匹配所有内容,包括我不想要的 #
行。
- 如何匹配所有,除了
#
行(换句话说,如何否定正则表达式)?
您可以使用
/#.+(*SKIP)(*F)|_\w+/
或者,在单词边界处匹配 _
:
/#.+(*SKIP)(*F)|\b_\w+/
模式匹配
#.+(*SKIP)(*F)
-#
和除换行字符外的任何1个或多个字符尽可能多,然后跳过,省略,丢弃匹配并从中搜索下一个匹配跳过比赛的地方|
- 或_\w+
- 一个_
然后是任何 1 个或多个单词字符。
执行以下操作:
/^[^#]*(_\w+)/