我有以下字符串:
CLASSIC STF
CLASSIC
正在使用regexp来匹配字符串。
Pattern p = Pattern.compile("^CLASSIC(\\s*)$", Pattern.CASE_INSENSITIVE);
CLASSIC STF
也正在显示。
我正在使用m.find()
怎么可能只显示CLASSIC
而不是CLASSIC STF
感谢您的帮助。
答案 0 :(得分:2)
如果您使用Matcher.find()
,则表达式CLASSIC(\s*)
将与CLASSIC STF
匹配。
但是,Matcher.matches()
将返回false,因为它要求表达式与整个输入匹配。
要使Matcher.find()
执行相同操作,请将表达式更改为^CLASSIC(\s*)$
,如reto所述。
答案 1 :(得分:2)
默认情况下,^
和$
分别与整个输入字符串的开头和结尾匹配,忽略任何换行符。我希望你的表达式与你提到的字符串不匹配。事实上:
String pattern = "^CLASSIC(\\s*)$";
String input = "CLASSIC STF%nCLASSIC";
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(String.format(input));
while (m.find()) {
System.out.println(m.group());
}
没有打印结果。
如果您希望^
和$
匹配字符串中所有行的开头和结尾,则应启用“多行模式”。通过用Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE + Pattern.MULTILINE);
替换上面的第3行来实现。当我这样做时,我得到一个结果,即:“CLASSIC”。
您还问为什么“CLASSIC STF”不匹配。让我们分解你的模式,看看为什么。模式说:匹配任何......
^
CLASSIC
(\s*)
$
在匹配“CLASSIC STF”中的空格(步骤3)后,我们正在看一个字符“S”。这与行结尾(步骤4)不匹配,因此我们无法匹配正则表达式。
请注意,正则表达式中的括号不是必需的。你可以把它们留下来。
The Javadoc of the Pattern class非常精细。阅读它可能会有所帮助。
修改强>
如果要使用正则表达式检查字符串/行是否包含单词“CLASSIC”,那么我建议使用正则表达式\bCLASSIC\b
。如果你想看一个字符串是否以“CLASSIC”开头,那么我会使用^CLASSIC\b
。
答案 2 :(得分:1)
我想知道这是否会有所帮助: practice = c(" CLASSIC STF"," CLASSIC") grep(" ^ CLASSIC [[:space:] STF]?",practice)