当前位置: 首页 > 面试题库 >

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

谭嘉歆
2023-03-14
问题内容

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()方法。然后是与String或Pattern类find()不同的方法,它不同于matches()

另一个原因是避免一遍又一遍地创建相同的Pattern对象。每次您使用String中正则表达式支持的方法之一(或matches()Pattern中的静态方法)时,它都会创建一个新的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没有等效的功能。在幕后创建的Pattern
String#matches(String)和使用显式创建的Pattern之间没有区别Pattern#compile(String)

(编辑:我原来是说,所有的.NET regex对象缓存,这是不正确由于.NET
2.0,只能用静态的方法,如自动缓存发生。Regex.Matches(),而不是当你直接调用正则表达式的构造。REF)



 类似资料:
  • 问题内容: 它可能是实现细节,但是对于Oracle和IBM JDK而言,至少是对已编译模式进行了缓存,还是作为应用程序开发人员我们需要自己对已编译模式进行缓存? 问题答案: 我不认为结果会被缓存,并且代码或文档中也没有这种行为的证据。自己实现这样的缓存(当然)是比较琐碎的,但是我对这样的缓存很有用的用例感兴趣。 回覆。下面的注释和String.split(),有一种不同的方法,即代码采用简单的1或

  • 我使用正则表达式来查找一个字符串是否存在于一个书页中。下面是相同的代码。 观察: > 案例1:当searchText=“(222M)”时 结果:找到字符串。 案例2:当search chText="(222M"//缺少括号时 我得到以下例外。 索引22:.\b.{0}(1110r.{附近regexp模式中嵌套的括号不正确。{0}.\b 还有更好的在页面中查找字符串的选项。使用String.cont

  • 在Java 11下运行的旧式JRuby应用程序(1.6.8)上,我跟踪了一个特殊的错误:测试用例:错误。对于其他内置的JRE类,这似乎工作得很好(见下文)。 这有时会导致JRuby本身失败,具体到https://github.com/jruby/jruby/blob/1.6.8/lib/ruby/site_ruby/shared/builtin/javasupport/core_ext/objec

  • Java 提供了 java.util.regex 包,用于与正则表达式进行模式匹配。

  • 问题内容: 标题几乎总结了一下。 外部样式表具有以下代码: 我尝试使用: 和 但都行不通。是否有可能使用javascript覆盖!important样式。 如果有区别的话,这是给 greasemonkey扩展的。 问题答案: 我相信这样做的唯一方法是将样式添加为带有’!important’后缀的新CSS声明。最简单的方法是将新的元素附加到文档的开头: 使用上述方法添加的规则(如果使用!import

  • 随着我们的科技文化的进步,软件技术从不可想象,到研究,到新的产品,到标准化产品,到广泛可用和廉价产品。这些重型工具可以拉动很大的负载,但可能是进阶的,并且需要花大量投资去理解。进阶程序员必须知道如何管理它们以及它们什么时候应该被使用或考虑。 现在在我看来,一些最好的重型工具是: 关系数据库; 全文搜索引擎; 数学库; OpenGL; XML 解析器; 电子表格。