Java正则表达式问题:优化NxC格式匹配规则
Great question—your original regex is close, but the issue is that it doesn’t link the optional letters (C) to the presence of 'x'. Let’s break this down and fix it.
Why Your Original Regex Fails
Your regex ([0-9]+)(x?)([A-Z]*) allows letters to appear even when 'x' is missing because the [A-Z]* group is independent of the x? group. So something like 123ABC gets matched as digits + no x + letters, which violates your rule that C must come after x.
The Corrected Regex
Here’s the regex that enforces your requirements strictly:
^[0-9]+(x[A-Z]*)?$
Let’s Break Down Each Part
^and$: These anchors ensure we match the entire input string (no partial matches, which is crucial for validation).[0-9]+: Matches one or more digits (your required N component).(x[A-Z]*)?: This is the optional part, wrapped in a group made optional by the trailing?. It means:- If you include 'x', you can optionally follow it with any number of uppercase letters (C).
- If you don’t include 'x', you can’t have any letters at all.
Testing the Regex
Let’s verify against your examples and invalid cases:
- Valid inputs:
01: Matches the digit group, no optional part → success.9x: Matches digits +x[A-Z]*(x with zero letters) → success.789xAUX: Matches digits + x followed by letters → success.
- Invalid inputs:
123ABC: No 'x' before letters → no match (correctly rejected).A123: Starts with letters instead of digits → no match.12x3: Digits after x (not allowed per your rule) → no match.
Optional Adjustments
If you need to allow lowercase letters (though you specified A-Z), modify the regex to ^[0-9]+(x[A-Za-z]*)?$. If you want to require at least one letter when 'x' is present (your examples allow 9x so this is probably unnecessary), change it to ^[0-9]+(x[A-Z]+)?$.
内容的提问来源于stack exchange,提问作者chris01

