gpt4 book ai didi

java.util.regex - Pattern.compile() 的重要性?

转载 作者:IT老高 更新时间:2023-10-28 11:19:43 24 4
gpt4 key购买 nike

Pattern.compile()方法的重要性是什么?
为什么我需要在获取 Matcher 对象之前编译正则表达式字符串?

例如:

String regex = "((\\S+)\\s*some\\s*";

Pattern pattern = Pattern.compile(regex); // why do I need to compile
Matcher matcher = pattern.matcher(text);

最佳答案

compile() 方法总是在某个时候被调用;这是创建 Pattern 对象的唯一方法。所以问题真的是,为什么要明确地称它为?一个原因是您需要对 Matcher 对象的引用,以便您可以使用它的方法,如 group(int) 来检索捕获组的内容。获取 Matcher 对象的唯一方法是通过 Pattern 对象的 matcher() 方法,而获取 Pattern 对象的唯一方法是通过 compile() 方法。然后是 find() 方法,与 matches() 不同,该方法在 String 或 Pattern 类中不重复。

另一个原因是避免一遍又一遍地创建相同的 Pattern 对象。每次使用 String 中的正则表达式驱动方法之一(或 Pattern 中的静态 matches() 方法)时,它都会创建一个新 Pattern 和一个新 Matcher。所以这段代码片段:

for (String s : myStringList) {
if ( s.matches("\\d+") ) {
doSomething();
}
}

...完全等价于:

for (String s : myStringList) {
if ( Pattern.compile("\\d+").matcher(s).matches() ) {
doSomething();
}
}

显然,这做了很多不必要的工作。事实上,与执行实际匹配相比,编译正则表达式和实例化 Pattern 对象很容易花费更长的时间。因此,将这一步拉出循环通常是有意义的。您也可以提前创建 Matcher,尽管它们的成本并不高:

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if ( m.reset(s).matches() ) {
doSomething();
}
}

如果您熟悉 .NET 正则表达式,您可能想知道 Java 的 compile() 方法是否与 .NET 的 RegexOptions.Compiled 修饰符有关;答案是不。 Java 的 Pattern.compile() 方法仅相当于 .NET 的 Regex 构造函数。当您指定 Compiled 选项时:

Regex r = new Regex(@"\d+", RegexOptions.Compiled); 

...它将正则表达式直接编译为 CIL 字节码,使其执行速度更快,但在前期处理和内存使用方面付出了巨大的代价——将其视为正则表达式的类固醇。 Java 没有等价物;由 String#matches(String) 在幕后创建的模式与使用 Pattern#compile(String) 显式创建的模式没有区别。

(编辑:我最初说所有 .NET Regex 对象都被缓存,这是不正确的。从 .NET 2.0 开始,自动缓存只发生在像 Regex.Matches() 这样的静态方法中,而不是在直接调用 Regex 构造函数。ref )

关于java.util.regex - Pattern.compile() 的重要性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1720191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com