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

     2023-02-23     116

关键词:

【中文标题】是否有正则表达式来匹配包含 A 但不包含 B 的字符串 [重复]【英文标题】:Is there a regex to match a string that contains A but does not contain B [duplicate] 【发布时间】:2012-01-04 15:51:49 【问题描述】:

我的问题是我想用纯正则表达式检查浏览器字符串。

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 

不应该匹配

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

【问题讨论】:

什么语言,正则表达式? regular-expressions.info/tools.html 没那么容易:[***.com/q/8186424/241506][1][1]:***.com/q/8186424/241506 你想用(?:[^])*?表达什么? 【参考方案1】:

我只想分手

if ((m/Android/i) && (m/Safari/i) && !(m/Mobile Safari/i))

也就是说,根据正则表达式风格,您可以将其组合起来

if ((m/Android/i) && (m/(?<!Mobile )Safari/i))

甚至

if (m/Android.*(?<!Mobile )Safari/i)

仅供参考Lookahead/lookbehind


更新用 Perl5 正则表达式风格(可以说是最流行的风格)对这些进行了很好的测试:

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

演出:

1 yes

对于 OP 中的给定输入

【讨论】:

现在用兼容 Perl5 的正则表达式对其进行了测试【参考方案2】:

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

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

^(?=.*Android).*

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

^(?=.*Android)(?=.*Mobile).*

如果要确保某个单词不在字符串中,请使用否定前瞻:

^(?=.*Android)(?!.*Mobile).*

这将要求字符串中包含单词“Android”,并且字符串中不允许包含单词“Mobile”。当开头的断言为真时,.* 部分匹配完整的字符串/行。

看here on Regexr

【讨论】:

+1 表示最简单的纯正则表达式方法,但我将其写为^(?=.*Android)(?!.*Mobile).*。否则,将在每个位置应用前瞻,或者直到它们都成功。您的正则表达式按预期工作,因为除了开始之外,积极的前瞻总是失败,但如果您只有消极的前瞻怎么办? @AlanMoore 感谢您的建议,我使用它编辑了我的答案。 @Stema 感谢您的精彩解释。今天学到了一些新东西。 Дай тебе бог здоровья!【参考方案3】:

通过一些正则表达式的实现,您可以使用否定的lookbehind 断言。 根据文档,写为(?&lt;!...) 的负向lookbehind 仅在字符串中的当前位置之前没有匹配... 时才匹配

这是一个 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

【讨论】:

正则表达式匹配两个特殊字符中间的内容

今天在使用正则表达式中,要匹配两个字符中间的内容,一时没有写出来,后来在网上找到了,记录一下。 匹配两个字符串A与B中间的字符串包含A与B: 表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个)... 查看详情

用正则表达式怎样匹配不包含特定字符串的字符串

...16”、“三星I5800”、“诺基亚C5”。。。。。。求一正则表达式,能匹配所有不含“诺基亚”的字符串正则表达式匹配公式为:^((?!XXX).)*$,XXX为字符串。另外列举一些正则表达式的语法:[abc]a或b或c.任意单个字符a?零个或一个a[^... 查看详情

正则表达

1、正则表达式-简介正则表达式的使用,可以通过简单的办法来实现强大的功能。下面先给出一个简单的示例:^ 为匹配输入字符串的开始位置。[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。abc$... 查看详情

Python regex - 匹配仅包含 A、B 或 C 的单词

...间】:2013-05-1501:16:00【问题描述】:我可以使用什么正则表达式来匹配仅由字符A、B或C组成的单词?例如,正则表达式会捕获ABCBACBACBABBABCC和A和B和C,但不会捕获ABCD、ABC1等。【问题讨论】:【参考方案1】:\\b[ABC]+\\b呢?这行 查看详情

正则表达式如何完成匹配某个字符串但是不包含指定字符串

...晕 参考技术B不明白,好象可以用查找替换做追问用正则表达式:类似:.*(?!.*?no).*部门.*名称 查看详情

正则表达式

匹配两个字符串A与B中间的字符串包含A与B: 表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个) 示例:Awww.go4mi.topB 结果:Awww.go4mi.topB 匹配两个字符串A与B中间的字符串包含A但是不包含B: 表达式... 查看详情

php正则表达式只能包含字母和数字

php正则表达式只能包含字母和数字判断字符串是否只包含字母和数字例如$a="123";$b="acb";$c="abc123";abc变量都可以通过判断实在不会正则多谢大佬了/抱拳式子:/^[a-zA-Z0-9]+$/u释义:"/":表示正则表达式... 查看详情

linux中^[^abc]正则表达式啥意思

...。3、^[^a-z]开头不包含小写字母的字符匹配。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的特点是:1.灵活性、逻辑性和功能性非常强;2.可以迅速地用极简单的方式达到字符串的... 查看详情

java正则表达式包含字母数字特殊字符

...sp; /***/gi gi是全局不区分大小写匹配 ***是正则表达式希望我这样写你能从中得到启发            ------------------------------------------------- 查看详情

正则表达式(代码片段)

正则表达式正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。下面来介绍一些基本的规则1.正则基本语法... 查看详情

正则表达式

...表符[[:blank:]] 纯数字[[:digit:]][0-9] 标点符号[[:punct:]]正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系... 查看详情

正则表达式中两个不同的匹配条件怎么在一条语句里执行

...,新建一个py文件。importre,也就是引入regularexpression正则表达式库。2、test=re.compile(r'\\*')print(test.findall("666*888"))如果要匹配星号,只需要在前面加上反斜杠。3、如果不加上反斜杠就会出现错误。4、test=re.compile(r'... 查看详情

python正则表达式之re.match()

...这些几乎天天都可以碰到的模式匹配/搜索问题中,正则表达式就是一把解决问题的利剑!在Python的re模块中,常用的有四个方法(match、search、findall、finditer)都可以用于匹配字符串,今天我们先来了解一下re.match()。re.match()必须从... 查看详情

Python 是不是有更简洁的方式来表达“如果 x 包含 a|b|c|d...”? [复制]

...haveacleanerwaytoexpress"ifxcontainsa|b|c|d..."?[duplicate]Python是否有更简洁的方式来表达“如果x包含a|b|c|d...”?[复制]【发布时间】:2013-11-1121:40:17【问题描述】:检查字符串x是否是y的子字符串的Pyth 查看详情

正则表达式的学习要点

1.字符类  定义:将任何单个字符直接量放进方括号内就组成了字符类  特性:1一个字符类可以匹配方括号内的任意字符 // /[a,b,c]/可以匹配任何包含abc的字符串       2字符类只匹配... 查看详情

sql teradata 正则表达式包含模式匹配

】sqlteradata正则表达式包含模式匹配【英文标题】:sqlteradataregexcontainspatternmatching【发布时间】:2020-01-1417:24:21【问题描述】:我在teradata中有一个如下所示的列。我想提取仅存在“FEMA”的所有行。我不想在开头、中间或结尾找... 查看详情

用于包含字母数字和特殊字符但不包含特殊字符的正则表达式

】用于包含字母数字和特殊字符但不包含特殊字符的正则表达式【英文标题】:Regexforincludingalphanumericandspecialcharactersbutnotspecialcharactersontheirown【发布时间】:2021-06-1007:51:15【问题描述】:我正在尝试为数据成员创建一些验证规... 查看详情

如何获得正则表达式来检查字符串是不是仅包含字母字符 [a-z] 或 [A-Z]?

】如何获得正则表达式来检查字符串是不是仅包含字母字符[a-z]或[A-Z]?【英文标题】:HowcanIgetaregextocheckthatastringonlycontainsalphacharacters[a-z]or[A-Z]?如何获得正则表达式来检查字符串是否仅包含字母字符[a-z]或[A-Z]?【发布时间】:20... 查看详情