Java中的正则表达式是否默认使用^和$字符锚定?

根据我对正则表达式的理解,字符串“00 ###”必须与“[0-9]”匹配,但不能与“^ [0-9] $”匹配。 但它不适用于Java regexp。

在对此问题进行一些调查后,我发现了以下信息( http://www.wellho.net/solutions/java-regular-expressions-in-java.html ):

可能看起来Java正则表达式默认使用^和$字符锚定。

我们可以确定所有版本的JDK都适用吗? 并且可以关闭此模式(即禁用^和$的默认锚定)?

正如您链接的文章所解释的那样,它取决于您调用的function。 如果要在默认情况下添加^和$,请使用String#matchesMatcher#matches 。 如果您不想这样,请改用Matcher#find方法。

 import java.util.regex.*; public class Example { public static void main(String[] args) { System.out.println("Matches: " + "abc".matches("a+")); Matcher matcher = Pattern.compile("a+").matcher("abc"); System.out.println("Find: " + matcher.find()); } } 

输出:

 Matches: false Find: true 

除了Byers先生的回答之外 ,还要注意Matcher#find()在最后一次成功比赛中取消。 这只对重复使用Matcher实例很重要,但这是允许模拟Perl的\G断言的function。 它与Matcher#usePattern(Pattern)一起使用也很有用,你可以使用一个模式找到一些前缀,然后交换一个重复模式(包括\G )来循环重复匹配Matcher#find()

还有Matcher#lookingAt() ,它在开头( ^ )隐式限制但不在结尾处。 我更愿意认为这个名字的灵感来自Emacs的function。

是的, matches()总是表现为正则表达式锚定在两端。 要获得与目标的任何子字符串匹配的传统行为,您必须使用find() (正如其他人已经指出的那样)。 很少有正则表达式工具提供与Java的matches()方法等效的东西,因此您的混淆是合理的。 我能想到的唯一另一个是XML Schema风格。