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