Java正则表达式混乱

时间:2010-09-08 19:46:12

标签: java regex

我有以下(Java)代码:

public class TestBlah {
    private static final String PATTERN = ".*\\$\\{[.a-zA-Z0-9]+\\}.*";

    public static void main(String[] s) throws IOException {
        String st = "foo ${bar}\n";

        System.out.println(st.matches(PATTERN));
        System.out.println(Pattern.compile(PATTERN).matcher(st).find());
        System.exit(0);
    }
}

运行此代码,前System.out.println输出false,而后者输出true

我在这里不明白吗?

3 个答案:

答案 0 :(得分:3)

这是因为.与新行字符不匹配。因此,包含新行的String与匹配以.*结尾的字符串不匹配。因此,当您调用matches()时,它会返回false,因为新行不匹配。

第二个返回true,因为它在输入字符串中找到匹配项。它不一定与整个字符串匹配。

来自the Pattern javadocs

  

.任何字符(可能与行终止符匹配也可能不匹配)

答案 1 :(得分:1)

String.matches(..)的行为与Matcher.matches(..)相似。来自Matcher

的文档
find(): Attempts to find the next subsequence of 
        the input sequence that matches the pattern.

matches(): Attempts to match the entire input sequence 
        against the pattern.

因此,您可以将matches()视为用^$包围正则表达式,以确保字符串的开头与正则表达式的开头和结束时相匹配字符串匹配正则表达式的结尾。

答案 2 :(得分:0)

匹配模式和在字符串

中查找模式之间存在差异
  • String.matches()

      

    判断此字符串是否与给定的正则表达式匹配。

    您的整个字符串必须与模式匹配。

  • Matcher.matches()

      

    尝试将整个输入序列与模式匹配。

    你的整个字符串必须匹配。

  • Matcher.find()

      

    尝试查找与模式匹配的输入序列的下一个子序列。

    在这里,您只需要“部分匹配”。


正如@Justin所说:
由于matches()与新的换行符(.\n\r)不匹配,因此\r\n无效。


资源: