非常简单的Java正则表达式没有给出预期的结果

时间:2016-11-13 04:18:09

标签: java regex

今天是我第一天通过Thinking in Java 4th Edition中的Strings章节学习正则表达式(在此之前没有背景)。我正在拉我的头发,为什么正则表达式不匹配输入字符串的任何区域。我在regex101中对此进行了测试,得到了我预期的结果,但是在Java(你无法在regex101网站上进行测试)结果是不同的。
编辑:在章节

中进行练习10

正则表达式:n.w\s+h(a|i)s
输入字符串:Java now has regular expressions
预期结果:在输入字符串
的区域"now has"中找到匹配项 实际结果:找不到匹配项

我的相关代码:

import java.util.regex.*;

public class Foo {
  public static void main(String[] args) {
    // NOTE: I've also tested passing the regex as an arg from the command line 
    //       as "n.w\s+h(a|i)s"
    String regex = "n.w\\s+h(a|i)s";
    String input = "Java now has regular expressions";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);

    // Starting at the beginning of the input string, look for a match in ANY 
    // region of the input string
    boolean matchFound = m.lookingAt();
    System.out.println("Match was found: " + matchFound);
  }
}
/* OUTPUT
-> Match was found: false
*/

2 个答案:

答案 0 :(得分:2)

使用boolean matchFound = m.find();代替boolean matchFound = m.lookingAt();

来自Javadocs

lookingAt()尝试将从区域开头开始的输入序列与模式匹配。

答案 1 :(得分:1)

使用m.find()代替m.lookingAt()

您可以打印m.group()

所获得的内容

请检查以下代码。

import java.util.regex.*;

public class Foo {
    public static void main(String[] args) {
        // NOTE: I've also tested passing the regex as an arg from the command
        // line
        // as "n.w\s+h(a|i)s"
        String regex = "n.w\\s+h(a|i)s";
        String input = "Java now has regular expressions";

        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);

        // Starting at the beginning of the input string, look for a match in
        // ANY
        // region of the input string
        boolean matchFound = m.find();
        System.out.println("Match was found: " + matchFound);
        System.out.println("Matched string is: " + m.group());
    }
}

lookingAt()的javadoc是

  

public boolean lookingAt()

     

尝试匹配输入序列,从开头开始   区域,反对模式。像匹配方法一样,这种方法   总是从该地区的开始开始;与那种方法不同,它   不要求整个区域匹配。

     

如果匹配成功,则可以通过获得更多信息   开始,结束和分组方法。

     

返回:当且仅当输入序列的前缀匹配时才返回true   这个匹配者的模式

这意味着,此方法需要在输入String的最开头进行正则表达式匹配。

此方法不经常使用,效果就像您将正则表达式修改为"^n.w\\s+h(a|i)s",并使用find()方法。它还给出了正则表达式在输入String的最开头匹配的限制。