问题
I'm trying to limit the entries to a specific format.
If the entry has 5500 or 5100 such as 01\01-5500-000-00 then I want to have this:
^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$
But if the entry has anything other than 5500 or 5100 I want to have this:
^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$
How can this be accomplished with the if then else idea?
回答1:
Conditional regex syntax is not supported by JavaScript regex engine, but it can be worked around with a non-capturing group containing 2 alternatives:
One with the positive look-ahead and
The second with the reversed, negative look-ahead.
This regex meets your criteria and is JavaScript compatible:
^(?:(?=.*\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})$
See regex demo
Let me break it down:
^
- Start of string(?:
(?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}-
- First alternative with the(?=.*\b5[15]00\b)
look-ahead that requires a whole word5500
or5100
inside the string, and the first pattern you have|
- alternation operator(?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2})
- Second alternative that is prepended with the(?!.*\b5[15]00\b)
negative look-ahead that makes sure there is no5100
or5500
inside the string, and only then matches your second pattern.
$
- end of string.
回答2:
Replace this part of the pattern [0-9]{4}
with the literal values for 5100/5500:
/^\d{2,}\\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/
[0-9]
is the same thing as\d
in JavaScript- For the else part, use the negative lookahead
(?!5[15]00)\d{4}
to guarantee it's not 5100/5500.
回答3:
Use conditionals, Eg:
(?(?=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})
Regex conditionals example: conditionals@regex101.com
In case that you're using a regex engine that is not PCRE based, you can be able to mimic the functionality by doing the following:
((?=positive-regex-statement)then|(?!negavite-regex-statement)then)
Eg.
^[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 regex conditionals example: mimic@regex101.com
来源:https://stackoverflow.com/questions/32852857/javascript-conditional-regular-expression-if-then-else