Regex 正则表达式如何匹配多个模式

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 |

如果我想匹配第一个模式,但又想取消匹配第二个模式,我应该在正则表达式中使用什么模式

例如,我希望匹配字符串“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 | 9))模式匹配
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.