Java 是否可以将正则表达式快捷方式设置为匹配?

Java 是否可以将正则表达式快捷方式设置为匹配?,java,regex,performance,optimization,Java,Regex,Performance,Optimization,我有一些正则表达式,它们运行在非常长的字符串上。然而,字符串中唯一与RE有关的部分是接近开头的部分。大多数REs类似于: \\s+?(\\w+?).* REs在开始附近捕获一些组,而不关心字符串的其余部分是什么。出于性能方面的考虑,是否有办法让重新引擎避免查看服务器使用的所有字符 注意:带有REs的应用程序是使用java.regex类编写的 编辑:例如,我有以下内容: .*?id="number"[^>]*?>([^<]+?).* 它针对存储为StringBuilder的大

我有一些正则表达式,它们运行在非常长的字符串上。然而,字符串中唯一与RE有关的部分是接近开头的部分。大多数REs类似于:

\\s+?(\\w+?).*
REs在开始附近捕获一些组,而不关心字符串的其余部分是什么。出于性能方面的考虑,是否有办法让重新引擎避免查看服务器使用的所有字符

注意:带有REs的应用程序是使用java.regex类编写的

编辑:例如,我有以下内容:

.*?id="number"[^>]*?>([^<]+?).*
它针对存储为StringBuilder的大型HTML文件运行。id=number的标记总是在HTML文件的开头附近。

为什么不直接取出。*,你不需要它

^\\s+?(\\w+?)

使用java.util.regex类时,有许多方法可以匹配给定字符串。Matcher.matches始终与整个输入字符串匹配。find在输入字符串中的某处查找与正则表达式匹配的内容。最后,Matcher.lookingAt将正则表达式与输入字符串的开头匹配


如果使用的是Matcher.matches,则可能需要结尾处的.*来匹配整个字符串。但是,您最好使用其他方法之一,这样可以省去。*。听起来Matcher.lookingAt可能适合您的目的。

如果您处理的是HTML,除非您对数据文件拥有100%的控制权,否则正则表达式不是进行分析的正确工具。它最终会崩溃


在我看来,您需要id=number的标签内容,显然还需要更多。宽松的解析器允许对HTML输入进行XSLT转换,这可能正是您所需要的。如果你感兴趣,我会查一下。

有一个很好的库,可以处理HTML文件,包括格式错误的真实文件:BeautifulSoup


使用此库很容易找到您的id=标记

在这种情况下,简单的答案是使用“查找”而不是“匹配”。但是,如果这对您不起作用,Java模式类支持带有所谓所有格量词的正则表达式,可以用来防止回溯

所有格量词是贪婪和不情愿量词的第三种选择。Java中的语法是“X++”或“X*++”或“X++”。所有格量词与贪婪量词一样匹配尽可能多的字符,但如果模式的其余部分不匹配,所有格量词将失败,而不是后退。有点像序言中的一个剪辑

但是要注意,使用所有格量词而不是贪婪或不情愿的量词会改变你模式的含义

这里有关于所有格量词的教程信息

…正则表达式的动态部分如下所示:

.*?         => '<div '

[^>]*?      => ' class="whatever"'

([^<]+?)    => 'a'

.*          => 'bc123</div>'

我也不想让任何人认为我在质疑公认的答案。我只是对过度使用/不适当使用不情愿的量词表示不满。

请发布一个您试图匹配的字符串示例。我们可以看到您使用的实际代码吗?这对我不适用。删除。*导致匹配失败。如果\\s+?\\w+?.*整个regexp?或者它是一个更大表达式的一部分?Ben,你想匹配什么?在什么输入上去掉。*失败了,使用什么特定的java代码?我想既然你选择了greg的答案,你使用的是匹配,这就解释了为什么michael的答案对你不起作用。是的,一旦我切换到查找,删除.*是可能的。当我需要Matcher.find的行为时,我正在使用Matcher.matches,谢谢!不幸的是,除非您能够控制数据文件,否则就没有合适的工具来解析HTML。世界上充斥着违反各种规范的HTML文件,它们会使任何常规JavaHTML解析器崩溃。例如,如果HTML不能像格式良好的XML那样可读,XSLT转换就会失败。正则表达式允许我们在如何查找数据方面有点模糊。而特定于HTML的解决方案通常期望标记具有特定的布局,具有精确的ID和已知的元素层次结构。@Stephen C,当我说存在允许XSLT使用HTML输入的宽松解析器时,我的意思是HTML解析器实际上存在,它可以构建DOM树或SAX流。我记得曾经读过这样一篇文章:Swing中的HTML解析器可以调整以实现这一点。如果我指的是格式良好的XHTML,我会这么说:-@Ben S,XPath表达式允许您轻松选择节点的文本,该节点的属性名为id,值为number。这就是Java的答案。他关心的是正则表达式需要解析整个字符串。您的答案是将整个字符串解析为DOM,以便执行搜索。我甚至不想从萨克斯中音开始
活生生的。别误会,我完全同意你的观点,但这并不适用于全球。如果要分解整个HTML或XML文档,则regex不是这样做的。就他所做的一小段工作而言,正则表达式是这项工作的正确答案。它将更快速、更可靠地从文档中提取一条信息。贪婪量词与不情愿量词的使用只会影响备选方案的尝试顺序。如果模式不匹配,正则表达式引擎必须尝试所有替代方法。@斯蒂芬:是的,但它可以更改正则表达式的哪些部分与输入的哪些部分匹配。我在回答中加了一个例子;即使有了这些漂亮的新格式选项,注释也太复杂了。不情愿的修改器还迫使正则表达式引擎为每一步的前进查阅下一个可能的匹配项,可能导致大量不必要的分支和回溯,如本例所示。
<div id="number" class="whatever">abc123</div>
.*?         => '<div '

[^>]*?      => ' class="whatever"'

([^<]+?)    => 'a'

.*          => 'bc123</div>'
([^<]+)     => 'abc123'

.*          => '</div>'
id="number"[^>]*+>([^<]+)