【问题标题】:regex how to match mutiple pattern正则表达式如何匹配多个模式
【发布时间】:2016-04-04 09:29:26
【问题描述】:

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

例如,我想匹配字符串 'id' 后跟小数,只要该小数不是 6 或 9。

所以它应该匹配 id1,id2,id3 ... 等,但不匹配 id6id9

我尝试了这种模式,但它不起作用:

"id(\d|(?!6|9))"

【问题讨论】:

  • 您必须将除69 之外的所有数字写入字符类。像这样的东西:/id[12345780]/gm
  • 这 (id1..id9) 是您真正想要实现的目标的一个很好的例子,还是您过度简化了您的问题?我之所以问,是因为要检查的可能事情范围如此之小,听起来不像是真实世界的情况。
  • 请说明id后面是否会跟多位数字?
  • 我添加了有关您的正则表达式为何无法按预期工作的详细信息。

标签: regex


【解决方案1】:

你可以像这样使用negative lookahead

正则表达式: \bid(?![69])\d\b

说明:

  • \b 确保单词边界。

  • (?![69]) 负前瞻确保数字不是 6 或 9。

  • \d 匹配id 之后的单个数字。

Regex101 Demo

【讨论】:

  • 您必须在模式中的\d 之后写+,以匹配id89
  • @Shafizadeh:这等于我的答案。
  • @Shafizadeh:由于 OP 在他的尝试中使用了 \d,我认为它只会是单个数字。让我澄清一下 OP 是否要匹配多个数字。否则只是因为我假设 多个数字 人们会快速按下投票按钮。
  • @noob 我明白了..这个问题有点模糊..无论如何,对于这类问题,您可以分别为这两个工作编写两种模式。
  • 是的,当 Wiktor 提出替代解决方案时,我正在写,所以重复相同的东西没有意义。
【解决方案2】:

这不是最好的解决方案,但您也可以使用 positive look ahead as 来做到这一点

\bid(?=\d)(?:\d\d+|[^69])\b

正则表达式分解

\b #word boundary
  id  #Match id literally
  (?=\d) #Find if the next position contains digit (otherwise fails)
  (?:  #Non capturing group
     \d\d+  #If there are more than one digits then match is success
       |    #OR (alternation)
     [^69]  #If its single digit don't match 6 or 9
  )   #End of non capturing group
\b

Regex Demo

如果你想检查id后面没有69,并且你想接受id16而不是id61这样的情况,那么你可以使用

\bid(?=\d)[^69]\d*\b

Regex Demo

【讨论】:

  • 你的模式匹配id69 id 正在被6 闲置。
  • @Shafizadeh OP 没有提到它不应该匹配包含 69 的任何内容
  • 不包含...以下。我认为 OP 想要匹配 id16,但不是 id61
  • @Shafizadeh \bid(?=\d)[^69]\d*\b.. 可以吗? regex101.com/r/uI8uZ7/5
  • 是的,它是:-) ... +1
【解决方案3】:

id(\d|(?!6|9)) 模式匹配 id 后跟任意 1 位数字,或者如果没有 69alternation\d(?!6|9))允许id6id9,因为第一个替代方案在 NFA 正则表达式中“获胜”(即未针对一场比赛进行测试后的其他替代方案)。

如果您只需要排除 id69 的匹配项,请使用

\bid(?![69]\b)\d+\b

regex demo

如果您想避免将所有id69 匹配,请使用

\bid(?![69])\d+

another regex demo

这里,\d+ 匹配一个或多个数字\b 代表单词边界(数字前后应带有非“单词”字符),@987654344如果id 之后有69,@lookahead 匹配失败(有或没有字边界检查 - 取决于您的需要)。

更新

如果需要排除编号不以69开头的id,可以使用

\bid[0-578]\d*

(demo)

基于Shafizadeh's 评论。

【讨论】:

  • 顺便说一下 negative lookahead 在这种情况下很好,但我仍然认为使用 character class 会比 lookahead 快得多regex101.com/r/lI6oS8/3
  • @Shafizadeh:这种方法不能用于检查数字是否不等于69。仅当您要检查号码是否 69 开头时才能使用。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多