栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485780.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号