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

时间:2015-09-29 20:06:39

标签: javascript regex ecmascript-5

我试图将条目限制为特定格式。

如果条目有5500或5100,例如01 \ 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理念实现这一目标?

3 个答案:

答案 0 :(得分:13)

JavaScript正则表达式引擎不支持条件正则表达式语法,但它可以与包含2个备选方案的非捕获组一起使用:

  1. 一个有正向前瞻和

  2. 的人
  3. 第二个是反向,负向前瞻。

  4. 此正则表达式符合您的条件且与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,然后才匹配你的第二种模式。
    • $ - 字符串结束。

答案 1 :(得分:3)

使用条件,例如:

(?(?= regex)然后| 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

答案 2 :(得分:2)

将模式calc的这一部分替换为5100/5500的文字值:

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