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

Dix*_*onD 20 java regex

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

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

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

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

Mar*_*ers 24

正如您链接的文章所解释的那样,它取决于您调用的功能.如果您想默认添加^和$,请使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Matches: false
Find: true
Run Code Online (Sandbox Code Playgroud)

  • @Laurence:JavaScript的`test()`,`exec()`和`match()`方法都是一样的:如果你希望匹配锚定,你必须自己锚定它.另一方面,Python的`match()`方法就像Java的`lookingAt()`; 匹配锚定到字符串的开头但不是结束. (6认同)

Ala*_*ore 5

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