Pattern Matcher不适用于whiteSpace

时间:2014-08-11 17:48:51

标签: java regex

我正在尝试使用模式Matcher java

搜索下面的单词

在doc中搜索的Word:

 (peak: somevalue) [

代码:

Matcher m= Pattern.compile("\\(peak:(.*?)\\)\\s[").matcher(currLine);

但没有得到预期的结果。

希望获得"某些价值"使用这个模式,请你指导我。

3 个答案:

答案 0 :(得分:1)

此代码为您提供正确的结果:

    String s="(peak: somevalue) [";
    Matcher m= Pattern.compile("\\(peak:(.*?)\\)\\s\\[").matcher(s);

    m.find();
    System.out.println(m.group(1));

答案 1 :(得分:1)

您需要在正则表达式结束时转义[,因为它也是用于创建[...] character class

的元字符之一
Pattern.compile("\\(peak:(.*?)\\)\\s\\[")
//here -----------------------------^^

并且您可以在\\s?之前添加(.*?),以便在第1组匹配中peak:之后不包含空格。

所以你的代码看起来像

Matcher m =  Pattern.compile("\\(peak:\\s?(.*?)\\)\\s\\[").matcher(currLine);
if(m.find())
    System.out.println(m.group(1));
//                            ^^^ group 1 will contain match from `(.*?)`

顺便说一句,看起来你应该使用正在尝试分析的语言解析器而不是正则表达式。如果您使用.*?,正则表达式可以为您提供许多问题,例如假阳性匹配,因为点.可以接受任何字符,因此在您的案例模式中"\\(peak:\\s?(.*?)\\)\\s\\["将接受以{{1}开头的任何字符串和} (peak:一样以) [结尾。

要解决此类问题,您需要更具体地说明应该接受哪种字符(peak:whatever)()<foo>{bar}{}(blah) [。其中一个想法是让它接受不是whatever的字符,以便您可以尝试使用

)

答案 2 :(得分:0)

你的冒号与(。*?)

的“任何捕获”之间需要一个\ s