当前位置: 首页 > 知识库问答 >
问题:

模式包含(?:.\s)*的正则表达式搜索?需要越来越长的时间

史默
2023-03-14
String regex = "<tr bgcolor=\"ffffff\">\\s*?<td width=\"20%\"><b>((?:.|\\s)+?): *?</b></td>\\s*?<td width=\"80%\">((?:.|\\s)*?)(?=(?:</td>\\s*?</tr>\\s*?<tr bgcolor=\"ffffff\">)|(?:</td>\\s*?</tr>\\s*?</table>\\s*?<b>Tags</b>))";

共有1个答案

桂飞翼
2023-03-14

交替(?:.\\s)+?效率很低,因为它涉及太多的回溯。

基本上,这种模式的所有变体都是极其低效的:(?:.\s)*?,(?:.\n)*?,(?:.\s)*,(?:.\n)*,(?:.\n)*)。(.\s)*?可能是最糟糕的。

为什么?

解决方案

如果要将任何字符(包括空格)与regex匹配,请使用

[\\s\\S]*?

或者使用(?s)(或pattern.dotallmatcher选项)启用单线模式,只需使用.(例如(?s)start(.*?)end)。

 类似资料:
  • 问题内容: 我运行一个发现有任何字* .sql文件后跟字后面的字。该select语句可以跨越很多行,并且可以包含制表符和换行符。 我已经尝试了以下几种变体: 但是,这将永远持续下去。谁能用正确的语法帮助我? 问题答案: 无需安装grep变体pcregrep,您可以使用grep进行多行搜索。 说明: 激活grep的perl- regexp (正则表达式的强大扩展) 禁止在行尾换行,用空字符代替。也就

  • 问题内容: 我有这个正则表达式使用向前和向后的前瞻: 我正在尝试将其从C#移植到Python,但始终收到错误 是否有可能用Python重写而不会失去意义? 这个想法是为了匹配类似 更新资料 我正在使用环顾四周解析已修改的HTTP多部分文本 我想在进行拆分时只获取文件路径和其他文本,而不必删除开始和结束标签 简短的代码很重要,但是如果它使正则表达式可行,我愿意更改格式。 问题答案: 对于同一数组中的

  • 问题内容: 我想在包含单行的超大文件(fe大于1 GB)中搜索模式。无法将其加载到内存中。目前,我使用读入缓冲区(1024个字符)。主要步骤: 将数据读入两个缓冲区 该缓冲区中的搜索模式 如果找到模式,则增加变量 将第二个缓冲区复制到第一个 将数据加载到第二个缓冲区 在两个缓冲区中搜索模式。 如果找到模式,则增加变量 重复上述步骤(从4开始),直到EOF 该算法(两个缓冲区)让我避免了将搜索到的文

  • 问题内容: 我需要找到与特定正则表达式匹配的所有软件包: 基本上,包的名字应该与启动,并有后话。例如,以下软件包应匹配: 我可以做,但是有很多我不感兴趣的软件包。 是否提供通过正则表达式查找软件包的方法?或者,我应该只是通过管道传递结果来过滤掉无关的包? 此外,可能是一个的“交集” ,并有助于太。 问题答案: alecxe,我相信这是您要寻找的一线客。 如下面评论中铬酸盐所建议的那样,您可以根据需

  • 我发现正则表达式不包含101,如下所示: 0*1*0*(1 00 000)*(010)* 我无法理解作者是如何想出这个正则表达式的。所以我只想到了不包含101的字符串: 01000100 我似乎上面的字符串不会与上面的正则表达式匹配。但我不确定。所以尝试在regex101.com上翻译成等效的pcre正则表达式,但也失败了(因为可以看到我的正则表达式甚至不匹配包含单个1的字符串。 我的翻译有什么问

  • 我需要一个正则表达式来检查和删除< code > membership user < code > userName 中的特殊字符。 当我第一次将网站设置为测试版时,我没有考虑到特殊字符不是获取用户名的好方法,“在我的应用程序中”。 下面我有一段模板代码,写得不太正确,但是给了愿意帮助的人一个好的开始。 --我需要从用户名中删除所有特殊字符和空格,同时更新用户名。 当我说我所说的特殊字符~、`、!