【问题标题】:How to put condition in Regex with multiple patterns? [duplicate]如何在具有多种模式的正则表达式中放置条件? [复制]
【发布时间】:2020-09-17 07:10:45
【问题描述】:

如何将这两种正则表达式模式合并到一个带有条件的语句中,如果 前三个数字是 123,则 regex2 适用,如果不等于 123,那么regex1是否适用?

Regex1 "^C\sN\+\d{10,12}\/?(EN|FR)?$"
Value 1:  CTC N+6534567890/FR  

Regex2 "^C\sN\+\d{12}\/?(EN|FR)?$"           
Value 2:  CTC N+123456789012/FR

【问题讨论】:

  • 模式开头的C不应该是CTC吗?
  • 由于正则表达式会在失败时回溯,所以一个简单的替换就可以了。 /123firstcase|secondcase 将匹配123 后跟firstcase,如果有123,则如果ihat 失败,它将尝试匹配secondcase

标签: regex


【解决方案1】:

你可以使用:

^CTC\sN\+(?:123\d{9}|\d{10,12})\/?(EN|FR)?$

Demo.

相关部分(即(?:123\d{9}|\d{10,12}))将匹配“123”后跟 9 位数字(Regex2 中总共 12 位)或 10 到 12 位数字(来自 Regex1)。

请注意,除非您想分别捕获“EN”和“FR”,否则您可以将捕获组转换为非捕获组(即(?:EN|FR))。

还有一点需要注意的是,如果数字以“123”开头并且长度 \d{10,12} 部分)。如果您需要防止这种情况(并假设您的正则表达式支持 Lookaheads),您可以使用:

^CTC\sN\+(?:123\d{9}|(?!123)\d{10,12})\/?(EN|FR)?$

Demo.


参考资料:

【讨论】:

  • 谢谢你,它有效...
  • 您好 @41686d6564 抱歉,但如果前 3 位为 123,则它适用于 >=12 位,如果以 123 开头,则应固定为 12 位,如果不以 123 开头,则可能是 10,11 和 12数字...
  • @Thirdy 不,它仅适用于正好 12 位(因为 123 的长度为 3,\d{9} 正好匹配 9 位)。你可以测试它here。你能举一个失败的例子吗?
  • 嗨 41686d6564 我试过这些值它匹配 CTC N+123456789012/FR;CTC N+12345678901/FR;CTC N+1234567890/FR,最后两个值应该不匹配,因为它们是 10和 11 位数字只有 12 位数字应该匹配,除非它们不是以 123 开头...
  • @ThirdyLeon 你之前的评论说>=12,而不是<=12;这就是为什么我很困惑。无论如何,我已经想到了这一点,并添加了另一种模式来防止它,以防万一这是你需要的。请参阅更新的答案。另一方面,请编辑问题并为您正在使用的编程语言(或正则表达式风格)使用适当的标签。这有助于为您提供更相关的答案,因为并非所有正则表达式引擎都支持相同的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
相关资源
最近更新 更多