Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript条件正则表达式if-then-else_Javascript_Regex_Ecmascript 5 - Fatal编程技术网

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

Javascript条件正则表达式if-then-else,javascript,regex,ecmascript-5,Javascript,Regex,Ecmascript 5,我试图将条目限制为特定的格式 如果条目有5500或5100,如01\01-5500-000-00,则我希望有: ^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$ ^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$ 但如果条目中有5500或5100以外的内容,我希望有以下内容: ^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$ ^[0-9]{2,}\\[0-9]{2

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

如果条目有5500或5100,如01\01-5500-000-00,则我希望有:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$
^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$
但如果条目中有5500或5100以外的内容,我希望有以下内容:

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

使用if-then-else思想如何实现这一点?

使用条件句,例如:

(?(?=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]{9}-[0-9]{2}

正则表达式条件示例:

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

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


模拟正则表达式条件示例:

JavaScript正则表达式引擎不支持条件正则表达式语法,但可以使用包含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})$
    

    让我把它分解一下:

    • ^
      -字符串的开头
    • (?:
      • (?=.*\b5[15]00\b)[0-9]{2,}\\\[0-9]{2}-[0-9]{4}-[0-9]{3}-
        -第一个选择是
        (?=.*\b5[15]00\b)
        向前看,需要在字符串中包含一个完整的单词
        5500
        5100
        ,以及您拥有的第一个模式
      • |
        -交替运算符
      • (?!.\b5[15]00\b)[0-9]{2,}\\\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2})
        -第二个选项,前面加上
        (?!\b5[15]00\b)
        负向上看,确保字符串中没有
        5100
        5500
        ,然后才匹配第二个模式
    • $
      -字符串结束

    用5100/5500的文本值替换模式的这部分
    [0-9]{4}

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

    您使用的是什么语言?你试过什么?
    ^[0-9]{2,}\\[0-9]{2}-5[15]00-[0-9]{3}-${124; ^[0-9]{2,}\\\[0-9]{2}-(?!5[15]00)[0-9]{4}-[0-9]{3}-[0-9]{2}$
    我曾经帮助我正确地创建这个表达式。我试着使用括号中带5500的管道:(?=.*5500)^[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2}$-不正确,正如我所见,该工具只支持JS。但是仍然有可能。顺便说一下,
    01\01-5500-000-00
    与您的第一个模式不匹配。它应该失败吗?另外,第一个模式中的尾随的
    “-”
    是故意的吗?@user974061:您能告诉我您在这个正则表达式中使用的编程语言是什么吗?(这些条件仅由类似PCRE的引擎支持)。@Houseman:你真的读了整篇文章,还是只是无缘无故地投了反对票?我为非基于PCRE的引擎(也包括Javascript)提供了一个答案。感谢您的修复,@Revo,我有点困惑。