我试图将条目限制为特定格式。
如果条目有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理念实现这一目标?
答案 0 :(得分:13)
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})$
请参阅regex demo
让我分解一下:
^
- 字符串开头(?:
(?=.*\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
,然后才匹配你的第二种模式。$
- 字符串结束。答案 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]
相同\d
来保证它不是5100/5500。