正则表达式匹配-仅4个字符长且不包含特定单词

时间:2019-07-09 15:21:36

标签: regex

我目前正在尝试创建一个程序,以匹配特定长度或更长但不包含特定单词的单词。

目前,我有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来对此进行修改,但这似乎不起作用。

1 个答案:

答案 0 :(得分:2)

您正在寻找\b(?![^\W_]*apple)[^\W_]{4,}\bexplained 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
$