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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 是否存在与包含a但不包含B的字符串匹配的正则表达式_Regex_Contains_Inverse - Fatal编程技术网

Regex 是否存在与包含a但不包含B的字符串匹配的正则表达式

Regex 是否存在与包含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

我的问题是我想用纯正则表达式检查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 (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).*