如何语法检查导出键值数据

How to syntax check export key value data

我允许用户以如下格式定义他们自己的用户数据:

export k0=v0;
export k1="v 1";

对于所有值字段,我希望它们都用双引号引起来。例如,上述情况的输出为:

export k0="v0";
export k1="v 1";

我这样做是为了确保用户能够在他们的值字段中允许 SPACE。

是否有 Java 库来检查每行输入的正确性?

这是必需的,因为如果输入如下所示:

export k2="v2;

它将把它作为错误输入,因为它没有右双引号。

我不认为有什么东西可以为你做到这一点。
你应该自己写 parser/regex

问题是 java.util.regex.Pattern class 不支持条件表达式。要解决这个问题,您可以使用第三方正则表达式库,例如 JRegex

在任何情况下,您都可以在正则表达式中做一些事情。
看看我为您的输入编写的这段代码。这不是最佳选择,但您可以从它开始。
这个想法是用两种不同的模式来检查它。 这些模式中只有一个应该匹配。 当然用更多的样本测试我的代码...

private final static String regexNoQuotes =  "(\s)*export(\s)+[a-zA-Z_][a-zA-Z0-9_]*(\s)*=(\s)*[a-zA-Z0-9_]+(\s)*";
private final static String regexWithQuotes = "(\s)*export(\s)+[a-zA-Z_][a-zA-Z0-9_]*(\s)*=(\s)*\"(\s)*[a-zA-Z0-9_\s]+(\s)*\"(\s)*";

private static boolean checkExportStatement(String str){
  return str.matches(regexNoQuotes) ^ str.matches(regexWithQuotes);
}

您可以使用简单的正则表达式来验证双引号输入:

private static final String PATTERN_EXPORT = "\\".*\\"";

这个正则表达式的解释:

\\" ---> begin quote(escaped)
.*   ---> anything 
\\" ---> final quote(escaped)

最后,您创建一个实用方法来验证您的输入:

private static boolean validateInput(String text) {
    if (text != null) {
        return text.matches(PATTERN_DOUBLE_QUOTED);
    }
    return false;
}

EX:

public static void main(String[] args) {
    String k0="\"v0\"";
    String k1="\"v 1\"";
    String k2="\"v2 ";

    System.out.println("export k0 =" + k0 + " is valid : " + validateInput(k0));
    System.out.println("export k1 =" + k1 + " is valid : " + validateInput(k1));
    System.out.println("export k2 =" + k2 + " is valid : " + validateInput(k2));
}

输出:

export k0 ="v0" is valid : true
export k1 ="v 1" is valid : true
export k2 ="v2  is valid : false

您的主要建议是验证密钥的值(导出),我不知道您如何获得该值(文件、属性文件、数据库、用户输入等),在所有情况下,您的主要建议是验证此密钥的值。

如果您的所有行都需要正则表达式:

private static final String PATTERN_DOUBLE_QUOTED = "export .[^\s-]*\=\\".*\\"";

说明

export  ------>begin
.[^\s-]*   ---> text without white space
\=  ---> = (escaped)
\\" ---> begin quote(escaped)
.*   ---> anything 
\\"    ---> final quote(escaped)