Java中无法用正则验证多组大括号包裹的数字字符串?
解决Java中多组{纯数字ID}字符串的正则验证问题
我来帮你搞定这个正则验证的问题!你原来用的\\{([^\\}]*.?)\\}没法满足需求,主要是因为它只匹配单个大括号组,而且没有限制内容必须是纯数字,也没约束整个字符串的边界。我们需要一个能覆盖所有测试用例的正则表达式。
正确的正则表达式
String validRegex = "^\\{\\d+\\}(\\{\\d+\\})*$";
正则各部分解释:
^:匹配字符串的起始位置,确保前面没有多余字符\\{\\d+\\}:匹配一组{纯数字},其中\\d+表示至少一个数字(如果允许空ID可以改成\\d*,但根据你的测试用例应该不需要)(\\{\\d+\\})*:允许0个或多个额外的{纯数字}组,这样单个组(测试用例3)或者多个组(测试用例1)都能匹配$:匹配字符串的结束位置,确保后面没有多余字符
结合测试用例验证
- 测试用例1:
{122}{323}→ 完全符合格式,返回true - 测试用例2:
{122}323}→ 结尾有多余的323},不匹配,返回false - 测试用例3:
{122323}→ 单个合法组,返回true - 测试用例4:
{122},{323}→ 包含逗号,不符合纯数字组的要求,返回false - 测试用例5:
{xx}{YY}→ 大括号内不是纯数字,返回false
Java代码示例
import java.util.regex.Pattern; import java.util.regex.Matcher; public class IdValidation { public static void main(String[] args) { String regex = "^\\{\\d+\\}(\\{\\d+\\})*$"; Pattern pattern = Pattern.compile(regex); // 逐个测试用例验证 String[] testCases = { "{122}{323}", "{122}323}", "{122323}", "{122},{323}", "{xx}{YY}" }; for (String test : testCases) { Matcher matcher = pattern.matcher(test); System.out.printf("%s → %b%n", test, matcher.matches()); } } }
运行这段代码会输出:
{122}{323} → true {122}323} → false {122323} → true {122},{323} → false {xx}{YY} → false
为什么原来的正则不行?
你之前的\\{([^\\}]*.?)\\}有几个核心问题:
- 它只匹配单个大括号组,不会检查整个字符串是否由多个合法组连续组成
[^\\}]*允许大括号内出现任意非}的字符(包括字母、符号),没法限制必须是纯数字- 没有
^和$的边界约束,所以即使字符串中有多余的非法字符(比如测试用例2的结尾),它也能匹配到其中的合法组,但不会验证整个字符串是否完全符合规则
内容的提问来源于stack exchange,提问作者Praveen Rawat
相关产品推荐
相关产品推荐

