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 个替代项的非捕获组来解决:
一个具有积极的前瞻性和
第二个具有相反的负面前瞻性。
此正则表达式符合您的条件并且 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
,并且只有然后匹配你的第二个模式。
$
- 字符串结尾。
将模式的这一部分 [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。
我正在尝试将条目限制为特定格式。
如果条目有 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 个替代项的非捕获组来解决:
一个具有积极的前瞻性和
第二个具有相反的负面前瞻性。
此正则表达式符合您的条件并且 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
,并且只有然后匹配你的第二个模式。
$
- 字符串结尾。
将模式的这一部分 [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 中的 - 对于else部分,使用negative lookahead
(?!5[15]00)\d{4}
保证不是5100/5500。
\d
相同