使用常规表达的数学设置验证



我需要验证给定的字符串并验证它是有效的集合,可能是包含内部集合的集合。示例:

 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)的情况下解决此问题。基本方法是将输入分为由

组成的令牌
  1. 单个开放或关闭支撑
  2. 逗号
  3. whitespace
  4. 标识符

然后,您在代币中扫描,跟踪筑巢水平。如果当您到达结束时,嵌套级别不是零,则输入字符串具有不平衡的支撑。

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,或者遇到错误。

最新更新