我目前正在尝试创建一个程序,以匹配特定长度或更长但不包含特定单词的单词。
目前,我有Regex:\S{4,}(?!\w*apple\w*)
在测试中使用时:I love these delicious applestoo
Regex仍然会匹配“ applestoo”,我不希望这样。
我可以看到这是一个逻辑错误,但是我不明白如何格式化此正则表达式。如果您有解决方案,请告诉我,谢谢。
编辑:
此代码现在适用于我的示例:(?!\w*apple\w*)\b\S{4,}\b
但是,使用此新示例时,它仍然会失败:'logigng some testing data _______-----apple-###zx'
我试图通过使用(?!\w*(apple|_)\w*)\b\S{4,}\b
来对此进行修改,但这似乎不起作用。
答案 0 :(得分:2)
您正在寻找\b(?![^\W_]*apple)[^\W_]{4,}\b
(explained at regex101)
这使用[^\W_]
作为字符匹配器,它将匹配不是非单词字符也不是下划线的任何字符。这样就留下了非下划线的单词字符,使其类似于[[:alnum:]]
(假设支持POSIX named character class或[0-9A-Za-z]
……如果您只想输入字母,可以考虑使用[[:alpha:]]
或仅ASCII字母[A-Za-z]
。
出于性能原因,在\b
字边界标记之后的否定超前表示,我们不能让“ apple”跟随这些字符中的零个或多个(无论跟随什么)。然后,我们要求匹配四个或更多这些字符,然后再匹配另一个单词边界标记。
在下面的命令行演示中,我使用grep -Po
进行了演示。 -P
导致grep
使用其PCRE解释器(来自libpcre),-o
使其仅显示匹配项,每个匹配项都位于其自己的行上:
$ echo 'logigng some testing data _______-----apple-###zx' \
|grep -Po '\b(?![^\W_]*apple)[^\W_]{4,}\b'
logigng
some
testing
data
$