我需要验证给定的字符串并验证它是有效的集合,可能是包含内部集合的集合。示例:
1) {1, 2, 3, 4} = valid
2) {1, 2, {3, 4}, 5} = valid
3) 1, 2, 3, 4 = invalid (missing brackets)
4) {1, 2, {3, 4, 5} = invalid (missing inner bracket)
这是我正在使用的正则(可读性):
String elementSeparator = "(,\s)?";
String validElement = "(\{?[A-Za-z0-9]*\}?" + elementSeparator + ")*";
String regex = "^\{" + validElement + "\}$";
当前,IT接受设置具有可选的打开和关闭括号,但是我只需要在它们俩都存在时接受,而不是内部集合缺少括号。在我当前的实现中,第四个示例被接受为有效集。
我该如何完成?
这是一些Java伪代码,用于如何在不使用任何重量级工具(例如ANTLR)的情况下解决此问题。基本方法是将输入分为由
组成的令牌- 单个开放或关闭支撑
- 逗号
- whitespace
- 标识符
然后,您在代币中扫描,跟踪筑巢水平。如果当您到达结束时,嵌套级别不是零,则输入字符串具有不平衡的支撑。
Pattern token = Pattern.compile("([{}]|,|[A-Aa-z0-9]+|s+)");
int nesting = 0
Matcher m = token.matcher(inputString);
while(m.find())
{
if (m.group(1).equals("{")
nesting++;
else if (m.group(1).equals("}")
{
nesting--;
if (nesting < 0)
error - too many right braces
}
else
....
}
if (nesting != 0)
log("incorrect nesting");
拥有此框架后,您可以将其增强以检测像两个逗号之类的东西:在看到逗号时设置标志,当您看到标识符(但不要使用空格)时清除标志。在逗号的分支和关闭支架中,您可以测试标志并发出错误消息,因为当时逗号无效。依此类推,对于您需要的任何验证。
请注意,我上面的伪代码不是一个完整的解决方案,只是旨在为您提供一般方法。一个完整的解决方案将更加参与,因为它必须处理无效的字符,从而使Lexer(将字符串分解为令牌的部分)更加复杂。
由于您使用匹配的括号,因此简单的正则语法是不够的。您需要研究所谓的免费语法。我建议研究Antlr,但这将比您想象的要重得多。
一种简单的方法是搜索最后一个紧随其后的'}',然后是'}'。然后验证之间的文本是否有效(应该是逗号分隔列表)。然后替换整个字符串(用虚拟值,例如0。然后重复直到剩下0,或者遇到错误。