我允许用户以如下格式定义自己的用户数据:
export k0=v0;
export k1="v 1";
对于所有值字段,我希望它们都是双引号。例如,上述案例的输出将是:
export k0="v0";
export k1="v 1";
我这样做是为了确保用户能够在其值字段中允许SPACE。
是否有Java
库检查每行输入的正确性?
这是必需的,因为如果输入如下:
export k2="v2;
它会将此作为错误输入,因为它没有接近的双引号。
答案 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)