默认情况下,Java 中的正则表达式是否同时使用 ^ 和 $ 字符进行锚定?

2022-09-01 20:45:36

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

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

Java 正则表达式似乎默认同时使用 ^ 和 $ 字符进行锚定。

我们能否确定这适用于所有版本的 JDK?是否可以关闭此模式(即禁用带有^和$的默认锚定)?


答案 1

正如您链接到的文章所解释的那样,这取决于您调用的函数。如果要默认添加 ^ 和 $ ,请使用 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

答案 2

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