如果用户代理字符串包含Chrome,如何不返回正则表达式匹配?

How to not return a regex match if a user agent string contains Chrome?

我想创建一个regex模式,为safari用户代理字符串提供匹配。问题是,铬似乎也匹配:

Safari正则表达式:

1
(?!Chrome).*Safari

这仍然与chrome用户代理字符串相匹配,但我认为负面展望可以解决这个问题?

Chrome用户代理:

1
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36

Safari用户代理:

1
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27

有人能为我提供一个regex解决方案吗?

更新:

我的答案是针对高效的用户代理regex来查找python中的safari,这并不能为这个问题提供regex解决方案。事实上,它根本没有解决这个问题,所以我很惊讶它被接受为一个答案

谢谢


您可以使用

1
^(?!.*Chrome).*Safari

请参阅regex演示。

细节

  • ^—字符串的开头
  • (?!.*Chrome)—如果行中断字符以外的0+字符后有Chrome子字符串,则匹配失败。
  • .*—除换行符以外的任何0+字符
  • SafariSafari子串。

更新(解决您答案中的问题)

用于Safari的Regex:

1
^(?!.*(?:Chrome|Edge)).*Safari

铬的Regex:

1
^(?!.*Edge).*Chrome

边缘的正则表达式:

1
/Edge/


这工作:

1
^(?!.*\bChrome).*$

演示

或者,

1
 ^(?!.*\bChrome).*\bSafari

如果你想找没有铬的狩猎比赛

您的regex (?!Chrome).*Safari的问题是您需要.*来匹配字符串开头的否定外观断言中Chrome前面的内容。


上面的答案对于桌面和Android都是正确的。对于iOS:

1
^(?!.*CriOS).*Safari

你试过这个基本的吗?它只适合狩猎。

.*(Safari).*

见REGEX101测试。


以@wiktor stribi为基础?ew&;@dawg回答得很好,我觉得这对于任何一个在用户代理字符串中包含"safari"的3个浏览器中寻找完整解决方案的人都很有用:

用于Safari的Regex:

1
^(?!.*Chrome|Edge).*Safari

铬的Regex:

1
^.*Chrome(?!.*Edge)

边缘的正则表达式:

1
Edge