Java中的正则表达式是否默认使用^和$字符锚定?
根据我对正则表达式的理解,字符串“00 ###”必须与“[0-9]”匹配,但不能与“^ [0-9] $”匹配。 但它不适用于Java regexp。
在对此问题进行一些调查后,我发现了以下信息( http://www.wellho.net/solutions/java-regular-expressions-in-java.html ):
可能看起来Java正则表达式默认使用^和$字符锚定。
我们可以确定所有版本的JDK都适用吗? 并且可以关闭此模式(即禁用^和$的默认锚定)?
正如您链接的文章所解释的那样,它取决于您调用的function。 如果要在默认情况下添加^和$,请使用String#matches
或Matcher#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风格。