我正在尝试匹配一个单词(Source Ip),其中每个字母可以是小写或大写字母,所以我写了一个正则表达式模式,但我的m.find()
显示为假即使正确匹配...
我的正则表达式模式或我写的方式有错吗?
String word = "Source Ip";
String pattern = "[S|s][O|o][U|u][R|r][C|c][E|e]\\s*[I|i][P|p]";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(word);
System.out.println(m.find());
答案 0 :(得分:7)
您可以简单地使用
String pattern = "SOURCE\\s*IP";
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Pattern.CASE_INSENSITIVE
会使匹配大小写不敏感。
答案 1 :(得分:5)
你不需要在大写和小写之间交替所有字母(注意,如其他人所提到的,字符类成语不需要|
来交替 - 在方括号之间添加它也会匹配|
字面意思。
您可以使用Pattern
标记对Pattern.CASE_INSENSITIVE
初始化进行参数化(在模式表示之前,替代内联使用将为(?i)
)。
例如:
Pattern.compile("(?i)source\\s*ip");
......或......
Pattern.compile("source\\s*ip", Pattern.CASE_INSENSITIVE);
注意强>
标记API here。
答案 2 :(得分:0)
此解决方案也存在接受 sourceip 的问题。
source\s*ip
因此正确答案应为
source\s+ip
强制两个单词之间至少有一个空格。
要在Java中使用此表达式,您必须转义反斜杠并使用类似:
的内容Pattern.compile("source\\s+ip", Pattern.CASE_INSENSITIVE);
答案 3 :(得分:-2)
如果你真的想因为某些原因而不是模式而使用正则表达式。方法然后这个正则表达式应该适合你的需要,它在我的java中工作得很好
[s|S][o|O][U|u][r|R][c|C][e|E][ ]*[i|I][p|P]
您使用
的情况\\s*
不会识别空格,但这将
\s*
你有一个斜线太多了:)
编辑: 我证明了我的无知,在检查regexpal后我错了,[sS]比[s | S]好 [sS] [oO] [Uu] [rR] [cC] [eE] [] * [iI] [pP] 谢谢Pshemo 是的,我完全忘了逃避角色Mena,谢谢你为我指出了