是否有正则表达式匹配包含A但不包含B的字符串

use*_*688 36 regex contains inverse

我的问题是我想用纯正则表达式检查browserstring.

Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
Run Code Online (Sandbox Code Playgroud)

- >应该匹配

Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 
Run Code Online (Sandbox Code Playgroud)

不应该匹配

我尝试过的解决方案是:/?((?<=Android)(?:[^])*?(?=Mobile))/i 但它完全匹配错误.

ste*_*ema 67

您可以使用前瞻断言来检查字符串是否包含单词.

如果你想确保字符串在某个地方包含"Android",你可以这样做:

^(?=.*Android).*
Run Code Online (Sandbox Code Playgroud)

您也可以将它们组合起来,以确保它在某个地方包含"Android"并在某个地方包含"Mobile":

^(?=.*Android)(?=.*Mobile).*
Run Code Online (Sandbox Code Playgroud)

如果您想确保某个单词不在字符串中,请使用负面预测:

^(?=.*Android)(?!.*Mobile).*
Run Code Online (Sandbox Code Playgroud)

这将需要单词"Android在字符串中,并且字符串中不允许使用单词"Mobile"..*当开头的断言为真时,该部分匹配完整的字符串/行.

在Regexr上看到它


seh*_*ehe 1

我只想把它打破

if ((m/Android/i) && (m/Safari/i) && !(m/Mobile Safari/i))
Run Code Online (Sandbox Code Playgroud)

也就是说,根据正则表达式的风格,你可以结合起来

if ((m/Android/i) && (m/(?<!Mobile )Safari/i))
Run Code Online (Sandbox Code Playgroud)

甚至

if (m/Android.*(?<!Mobile )Safari/i)
Run Code Online (Sandbox Code Playgroud)

仅供参考,请参阅前瞻/后瞻


更新使用 Perl5 正则表达式风格(可以说是最受欢迎的风格)测试了这些罚款:

perl -ne 'print "$. yes\n" if m/Android.*(?<!Mobile )Safari/i'
Run Code Online (Sandbox Code Playgroud)

显示:

1 yes
Run Code Online (Sandbox Code Playgroud)

对于OP中给定的输入