【问题标题】:conditional logic in regular expression正则表达式中的条件逻辑
【发布时间】:2020-12-11 12:12:08
【问题描述】:

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

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})$

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

  • +611800123456(这一定是成功的)

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

  • +61180012345(一定是失败)

这是我在正则表达式站点中的测试。

https://regexr.com/5ia2e

【问题讨论】:

  • 只用^\+61(?:1800\d{6}|\d{9})$(?=1800)\d{6}表示与\d{6}匹配的前四位必须是1800
  • @WiktorStribiżew 我试过了。它匹配 +61180012345。这必须失败,因为 1800 之后只有 5 个数字
  • 然后使用^\+61(?:1800\d{6}|(?!1800)\d{9})$。由于 JS 正则表达式中没有条件构造,因此您只需要在替代开始时使用前瞻来否定特定模式。
  • 谢谢大家。有效。你能解释一下吗?!在答案中。我可以标记为答案
  • @WiktorStribiżew 如果需要,可以发布。

标签: javascript regex


【解决方案1】:

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

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

在这里,你可以使用

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

请参阅regex demo

详情

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

【讨论】:

  • 我没有退出 (?!1800)\d{9} 中的最后一部分 mdn doc 他们使用不同的语法,你能详细说明那部分吗?
  • @AlanOmar (?!1800) 是一个负前瞻,如果在当前位置右侧有 1800 字符序列,则匹配失败。 MDN 仅提供一些示例,它们没有使用任何不同的语法。
  • 是的,如果?:1800\d{6} 不匹配,我现在知道了。正则表达式变为^\+61(?!1800)\d{9}$,它将匹配任何不以1800 开头的九位数字,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多