首页 > 解决方案 > 正则表达式中的条件逻辑

问题描述

我正在尝试使用正则表达式获取以下条件逻辑。

if (text starts with +61) {
  if (text after +61 is 1800) {
    // then match 6 digits after 1800. So, the regex until here should be +611800 and then 6 digits
  } else {
    // match 9 digits after +61
  }
}

我阅读了如何编写条件正则表达式。但是,我被以下正则表达式困在这里

^\+61((?=1800)\d{6}|\d{9})$

上面的正则表达式为此失败,但它必须成功

以下文本通过了正则表达式测试,但它必须失败

这是我在 regexr 网站上的测试。

https://regexr.com/5ia2e

标签: javascriptregex

解决方案


该模式表示与must be(?=1800)\d{6}匹配的前四位数字,而您希望匹配子字符串之后的任何六位数字。这意味着,您需要将非消费模式“转换”为消费模式。\d{6}18001800(?=1800)1800

另外,请注意,\d{9}第二种选择将匹配任何九位数字,而您只想匹配它们不是以 . 开头的1800。您需要在第二个替代方案之前添加一个(?!1800)负前瞻模式。不幸的是,JavaScript RegExp 不支持条件构造,在 PCRE、.NET 等中您可以使用 ^\+61(?(?=1800)1800\d{6}|\d{9})$,但在这种情况下不支持。

在这里,您可以使用

^\+61(?:1800\d{6}|(?!1800)\d{9})$

请参阅正则表达式演示

细节

  • ^- 字符串的开始
  • \+61-+61子串
  • (?:1800\d{6}|(?!1800)\d{9})- 一个匹配的非捕获组
    • 1800\d{6} -1800子字符串,然后是任意六位数字
    • |- 或者
    • (?!1800)\d{9}- 任何不以开头的九位数字1800
  • $- 字符串结束。

推荐阅读