Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何只匹配整个单词而忽略特殊字符_Regex - Fatal编程技术网

Regex 如何只匹配整个单词而忽略特殊字符

Regex 如何只匹配整个单词而忽略特殊字符,regex,Regex,对于本例,假设我们有以下关键字: banana apple. apple- apple party #(double space) apple pie sweet apple pie apple apple 34 如何使正则表达式只匹配没有特殊字符和多个空格的“apple”单词?所以从上面的例子来看,它只匹配最后4个,而忽略前4个 试试这个: \bapple\b(?!\s{2}|\S) 这需要在单词前后设置单词边界(\b),并排除后跟两个空格或非空白字符的匹配项 编辑:您在评论

对于本例,假设我们有以下关键字:

banana
apple.
apple-
apple  party #(double space)    
apple pie
sweet apple pie
apple
apple 34
如何使正则表达式只匹配没有特殊字符和多个空格的“apple”单词?所以从上面的例子来看,它只匹配最后4个,而忽略前4个

试试这个:

\bapple\b(?!\s{2}|\S)

这需要在单词前后设置单词边界(
\b
),并排除后跟两个空格或非空白字符的匹配项


编辑:您在评论中指出要匹配整行。这很容易;只需在上面的正则表达式之前和之后添加
*
,如下所示:

.*?\bapple\b(?!\s{2}|\S).*
(我在第一个
*
中添加了一个
,以避免回溯导致的性能问题。)


编辑2:基于其他注释:您还希望排除匹配项,如
apple。com
。这有点棘手,但这个正则表达式可以做到:

(?!.*?\bapple\b(?:\s{2}|\s*[.\/,<>-])).*?\bapple\b.*
(?!*?\bapple\b(?:\s{2}\s*[.\/,-])。?\bapple\b*

。这一个通过使用负前瞻来工作。组
(?!.\bapple\b(?:\s{2}\s*[.\/,-])
意味着该行不能包含
apple
,且该行后面不能有(a)2+空格或(b)任意数量的空格和集
,-
中的字符。这应该可以满足您的需要。

谢谢!这看起来是正确的,只有一个问题:它有可能是包含单词的整个句子或行吗?在“甜苹果派”示例中,只有苹果匹配。@NemaGa Sure;请参阅我的编辑。在正则表达式前后添加
*
将使其与整行匹配。实际上,出于性能原因,最好在之前和之后执行
*?
*
。不过有一个小问题(抱歉解释得不好),代码仍然匹配,例如“apple.com”,是否可以让它完全忽略这些特殊字符(.-/,)@NemaGa你能澄清一下吗?它是否应该排除任何在下一个单词前有特殊字符的
apple
。应该这样做。如果你需要额外的调整,你可能想问一个新问题,并参考这一个上下文。