Regex 是否存在与包含a但不包含B的字符串匹配的正则表达式
我的问题是我想用纯正则表达式检查browserstringRegex 是否存在与包含a但不包含B的字符串匹配的正则表达式,regex,contains,inverse,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 ->应该匹配 Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1
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
->应该匹配
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
不应该匹配
我尝试过的解决方案是:/?(?我会把它分解
if ((m/Android/i) && (m/Safari/i) && !(m/Mobile Safari/i))
也就是说,根据regex flaviour的不同,你可以将其结合起来
if ((m/Android/i) && (m/(?<!Mobile )Safari/i))
对于OP中的给定输入以及一些正则表达式的实现,可以使用否定的lookback断言。
根据文档,写为(?的负查找仅在字符串中的当前位置前面没有匹配…
下面是一个Python交互式脚本,展示了如何对示例字符串使用反向查找:
>>> s = "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"
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', s))
True
>>> t = "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"
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', t))
False
>>s=“Mozilla/5.0(Linux;U;Android 3.0;en-us;Xoom-Build/HRI39)AppleWebKit/534.13(KHTML,类似Gecko)版本/4.0 Safari/534.13”
>>>bool(re.search,r'Android.*(您使用先行断言来检查字符串是否包含单词
如果要确保字符串在某个位置包含“Android”,可以这样做:
^(?=.*Android).*
您还可以将它们组合在一起,以确保它在某些地方包含“Android”,在某些地方包含“Mobile”:
^(?=.*Android)(?=.*Mobile).*
如果要确保某个单词不在字符串中,请使用否定前瞻:
^(?=.*Android)(?!.*Mobile).*
这将要求字符串中包含单词“Android”,并且字符串中不允许包含单词“Mobile”。当开头的断言为true时,*
部分匹配完整的字符串/行
看到它了吗?什么语言,正则表达式的味道?它不是那么简单:[[1]:你想用(?:[^])*?
表达什么?现在用Perl5兼容的正则表达式+1测试它,以获得最简单的纯正则表达式方法,但我将它写成^(?=.*Android)(?!*Mobile).
。否则,lookaheads将应用于每个位置,或者直到它们都成功为止。您的正则表达式按预期工作,因为积极的lookaheads总是失败,但如果您只有消极的lookaheads呢?@Alanmore感谢您的建议,我使用它编辑了我的答案。@Stema感谢您的精彩解释今天学到了一些新东西。ааббзззббзббббзз!
^(?=.*Android).*
^(?=.*Android)(?=.*Mobile).*
^(?=.*Android)(?!.*Mobile).*