从文件读取模式与字符串文字

时间:2016-11-01 12:30:04

标签: java regex

我的正则表达式有问题。我使用以下代码从ArrayList中获取所有正则表达式,编译它并搜索匹配项:

public boolean match(String command){
    for (String regex : regexA) {
        System.out.println(regex);
        Pattern regPatter  = Pattern.compile(regex); 
        Matcher regMatcher = regPatter.matcher(command);

        if(regMatcher.find())
            return true;
    }

    return false;       
}

我测试它是这样的:

public static void main(String[] args){
    RegexMatcher reg = new RegexMatcher(new File("C:\\Users\\XXX\\Desktop\\regex.txt"));
    System.out.println(reg.match("password cisco"));
}

它将返回以下内容:

pas[a-z]\\s*\\w+
er\\w*\\s+(?!s).*
us[a-z]*\\s+((?!cisco).)*$
tr[a-z]*\\s+i[a-z]*\\s+\\w*\\s*
f[a-z]*\\s+f.*\\s*
en[a-z]*\\s+v.*
false

它将返回false。但如果我做的不同就像它有效:

public boolean match(String command){
    Pattern regPatter  = Pattern.compile("pas[a-z]\\s*\\w+"); 
    Matcher regMatcher = regPatter.matcher(command);

    if(regMatcher.find())
        return true;

    return false;
}

所以我的问题是如果我直接在Pattern.compile()中输入字符串就可以了,但是如果我喜欢我的match()方法,它将无效。

4 个答案:

答案 0 :(得分:0)

在字符串文字中,必须转义反斜杠。这意味着字符串\foo在Java源代码中作为字符串文字写入时,必须写成"\\foo"

您的第二个示例使用文字字符串"pas[a-z]\\s*\\w+"。实际上它对应于实际的字符串pas[a-z]\s*\w+"。但是列表中的字符串不是该字符串,而是pas[a-z]\\s*\\w+

答案 1 :(得分:0)

你的regex.txt文件应该只包含单个反斜杠" \"而不是双重反斜杠 - 即。它应该是:

pas[a-z]\s*\w+
er\w*\s+(?!s).*
us[a-z]*\s+((?!cisco).)*$
tr[a-z]*\s+i[a-z]*\s+\w*\s*
f[a-z]*\s+f.*\s*
en[a-z]*\s+v.*

在Java字符串中,反斜杠用于"转义"特殊字符 - 例如。 " \ n"导致只包含一个换行符的字符串,而不是" \"然后是" n"。

同样,双反斜杠" \"导致包含单个反斜杠的字符串。这就是你想要的正则表达式。

文件不需要转义任何东西(它们有已经编码的换行符等),因此它们不需要转义反斜杠 - 这就是为什么它们只需要单个索引。

答案 2 :(得分:0)

您可以分享您的文件: regex.txt

当我像这样修改你的代码时工作正常。

public boolean match(String command){
    String regexA[] = new String[] { "pas[a-z]\\s*\\w+",
                                     "er\\w*\\s+(?!s).*", 
                                     "us[a-z]*\\s+((?!cisco).)*$",
                                     "tr[a-z]*\\s+i[a-z]*\\s+\\w*\\s*",  
                                     "f[a-z]*\\s+f.*\\s*",
                                     "en[a-z]*\\s+v.*" };
    for (String regex : regexA) {
        System.out.println(regex);
        Pattern regPatter  = Pattern.compile(regex); 
        Matcher regMatcher = regPatter.matcher(command);

        if(regMatcher.find())
            return true; 
    } 

    return false;        
} 

答案 3 :(得分:0)

非常简单,从文件中读取的正则表达式与Java字符串中的正则表达式的转义不同。例如,正确的字符串是"\\w",但文件中的正确行是

\w