我的正则表达式有问题。我使用以下代码从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()
方法,它将无效。
答案 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