如何语法检查导出键值数据
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)
我允许用户以如下格式定义他们自己的用户数据:
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)