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

时间:2016-01-31 09:05:00

标签: java export environment-variables

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

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

对于所有值字段,我希望它们都是双引号。例如,上述案例的输出将是:

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

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

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

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

export k2="v2;

它会将此作为错误输入,因为它没有接近的双引号。

2 个答案:

答案 0 :(得分:0)

我不认为有什么东西能为你做到这一点 您应该编写自己的解析器/正则表达式

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

无论如何,你可以在正则表达式中做点什么 看看我为您的输入编写的代码。这不是最佳的,但它可以从它开始。
我们的想法是用2种不同的模式来检查它。 这些模式中只有一种应该匹配。 当然用更多样本测试我的代码...

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);
}

答案 1 :(得分:0)

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

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)