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

xdnvmnnf  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(188)

我目前正在尝试创建一个程序,匹配特定长度或更长的单词,但不包含特定的单词。
目前我有正则表达式:\S{4,}(?!\w*apple\w*)
当用于测试时:I love these delicious applestoo
那里正则表达式将仍然匹配'applestoo',这是我不想要的。
我可以看出这是一个逻辑错误,但我不明白如何格式化这个正则表达式。如果你有一个解决办法请告诉我,谢谢你提前。
编辑:
下面的代码现在可以用于我的示例:(?!\w*apple\w*)\b\S{4,}\b但是,使用此新示例时,仍然会失败:'logigng some testing data _______-----apple-###zx'
我已尝试通过使用以下内容对此进行修正:(?!\w*(apple|_)\w*)\b\S{4,}\b,但这似乎不起作用。

kqhtkvqz

kqhtkvqz1#

您正在查找\b(?![^\W_]*apple)[^\W_]{4,}\bexplained at regex101
这里使用[^\W_]作为字符匹配器,它将匹配任何非单词字符和下划线的字符,而非下划线的单词字符则保留下来,使其类似于[[:alnum:]](假设POSIX命名字符类支持)或[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
$
6fe3ivhb

6fe3ivhb2#

匹配仅包含4个字符的单词的正则表达式是“\B\w{4}\b”。“\b”是单词边界,它匹配单词字符(由\w字符类定义)和非单词字符之间的位置。“\w{4}”匹配任意四个单词字符,最后的“\b”也是单词边界。

let word = "word";
    let pattern = /\b\w{4}\b/;
    
    if (pattern.test(word)) {
        console.log("match");
    } else {
        console.log("no match");
    }

相关问题