匹配Exact字符串与正则表达式

时间:2013-11-22 12:16:54

标签: java regex

我有以下字符串:

CLASSIC STF
CLASSIC

正在使用regexp来匹配字符串。

Pattern p = Pattern.compile("^CLASSIC(\\s*)$", Pattern.CASE_INSENSITIVE); 

CLASSIC STF也正在显示。 我正在使用m.find() 怎么可能只显示CLASSIC而不是CLASSIC STF

感谢您的帮助。

3 个答案:

答案 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”不匹配。让我们分解你的模式,看看为什么。模式说:匹配任何......

  1. 从一行〜^
  2. 的开头开始
  3. 以C开头,后跟L,A,S,S,I和C~ CLASSIC
  4. 之后有0个或更多空格字符跟随〜(\s*)
  5. 之后我们看到一行结尾〜$
  6. 在匹配“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)