Javascript 条件正则表达式 if-then-else

Javascript conditional regular expression if-then-else

我正在尝试将条目限制为特定格式。

如果条目有 5500 或 5100,例如 01-5500-000-00 那么我想要这个:

^[0-9]{2,}\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$

但是如果条目有 5500 或 5100 以外的任何东西,我想要这个:

^[0-9]{2,}\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$

如何用 if then else 的想法来实现这一点?

使用条件,例如:

(?(?=regex)then|else): [0-9]{2,}\[0-9]{2}\-(?(?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-[0-9]{3}\-[0-9]{2})

正则表达式条件示例:conditionals@regex101.com

如果您使用的正则表达式 引擎 不是基于 PCRE 的,您可以通过执行以下操作来模拟该功能:

((?=positive-regex-statement)then|(?!negavite-regex-statement)then)

例如

^[0-9]{2,}\[0-9]{2}\-((?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-|(?!5[15]00)[0-9]{4}\-[0-9]{3}\-[0-9]{2})$

模拟正则表达式条件示例:mimic@regex101.com

JavaScript 正则表达式引擎不支持条件正则表达式语法,但它可以通过包含 2 个替代项的非捕获组来解决:

  1. 一个具有积极的前瞻性和

  2. 第二个具有相反的负面前瞻性。

此正则表达式符合您的条件并且 JavaScript 兼容:

^(?:(?=.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-|(?!.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2})$

regex demo

让我分解一下:

  • ^ - 字符串开始
  • (?:
    • (?=.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}- - (?=.*\b5[15]00\b) 前瞻的第一个替代方案需要字符串中的整个单词 55005100,以及您拥有的第一个模式
    • | - 交替运算符
    • (?!.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2}) - 第二个备选方案以 (?!.*\b5[15]00\b) 否定前瞻为前缀,确保字符串中没有 51005500,并且只有然后匹配你的第二个模式。
  • $ - 字符串结尾。

将模式的这一部分 [0-9]{4} 替换为 5100/5500 的文字值:

/^\d{2,}\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/
  • [0-9] 与 JavaScript
  • 中的 \d 相同
  • 对于else部分,使用negative lookahead (?!5[15]00)\d{4}保证不是5100/5500。