Regex 正则表达式如何匹配多个模式
如果我想匹配第一个模式,但又想取消匹配第二个模式,我应该在正则表达式中使用什么模式 例如,我希望匹配字符串“id”,后跟decimal,只要该decimal不是6或9 因此,它应该匹配Regex 正则表达式如何匹配多个模式,regex,Regex,如果我想匹配第一个模式,但又想取消匹配第二个模式,我应该在正则表达式中使用什么模式 例如,我希望匹配字符串“id”,后跟decimal,只要该decimal不是6或9 因此,它应该匹配id1、id2、id3…等,而不是id6和id9 我尝试过这种模式,但不起作用: "id(\d|(?!6|9))" 您可以像这样使用负前瞻 正则表达式:\bid(?![69])\d\b 说明: \b确保单词边界 (?![69])负前瞻确保数字不是6或9 \d匹配id后面的一个数字 id(\d |(?!6 |
id1、id2、id3…
等,而不是id6
和id9
我尝试过这种模式,但不起作用:
"id(\d|(?!6|9))"
您可以像这样使用
负前瞻
正则表达式:\bid(?![69])\d\b
说明:
确保单词边界\b
负前瞻确保数字不是6或9(?![69])
匹配\d
后面的一个数字id
id
,后跟任何一位数字,或者如果没有6
或9
。这种选择(\d
或(?!6 | 9)
)允许id6
和id9
,因为NFA正则表达式中的第一个选择“获胜”(即,一次匹配后的其他选择未经测试)
如果只需要排除与6
或9
匹配的id
,请使用
\bid(?![69]\b)\d+\b
见
如果要避免将所有id
与它后面的6
和9
匹配,请使用
\bid(?![69])\d+
看
这里,\d+
匹配一个或多个数字,\b
表示一个单词边界(数字前后应带有非“单词”字符),如果id
之后有6
或9
,则(?![69])
先行查找将失败匹配(带或不带单词边界检查-取决于您需要什么)
更新
如果需要排除编号不以6
或9
开头的id
,可以使用
\bid[0-578]\d*
\bid(?=\d)[^69]\d*\b
()
根据评论。这不是最好的解决方案,但您也可以使用
积极前瞻
作为解决方案
\bid(?=\d)(?:\d\d+|[^69])\b
正则表达式分解
如果要检查id
后面没有6
或9
,并且要接受像id16
而不是id61
这样的情况,则可以使用
\bid[0-578]\d*
\bid(?=\d)[^69]\d*\b
除了
6
和9
之外,您必须将所有数字写入一个字符类。类似于:这是(id1
。id9
)这是一个很好的例子,说明了你到底想要实现什么,或者你是否将问题过于简单化了?我之所以这么问,是因为这么一小部分可能需要检查的东西听起来不像是现实世界中的情况。请澄清id
后面是否会跟多个数字?我补充了一些详细信息,说明了为什么你的正则表达式不能按预期工作。您必须在模式中的+
之后写入+
,以匹配id89
@Shafizadeh:这将等于我的答案。@Shafizadeh:因为OP在尝试中使用了\d
,所以我假设它只会是一个数字。让我澄清一下OP是否想要匹配多个数字。否则,仅仅因为我假设多个数字,人们就会使用be快速向下投票按钮。@noob我明白了。这个问题有点模糊。无论如何,对于这类问题,你可以分别为两种工作编写两种模式。是的,当Wiktor提出另一种解决方案时,我正在写这篇文章,所以没有必要重复同样的内容。顺便说一句,在这种情况下,消极前瞻是可以的,但我仍然没有hink使用character类比lookahead快得多。@Shafizadeh:这种方法不能用于检查数字是否不等于6
或9
。它只能用于检查数字是否以6
或9
开头。您的模式匹配id69
哪个id
被6
@Shafizadeh拖累。OP没有提到它不应该匹配任何包含6
或9
但不包含以下内容的内容。我认为OP想要匹配id16
,但不是id61
@Shafizadeh\bid(?=\d][^69]\d*\b
。这可以吗?是:-)
+1.