你的问题是递归的…你知道吗,忘了递归! = p它在PHP中不会很好用,如果没有它,算法也很清楚.

function find_repeating_sequences($s)

{

$res = array();

while ($s) {

$i = 1; $pat = $s[0];

while (false !== strpos($s, $pat, $i)) {

$res[$pat] = 1;

// expand pattern and try again

$pat .= $s[$i++];

}

// move the string forward

$s = substr($s, 1);

}

return array_keys($res);

}

出于兴趣,我用PHP写了Tim’s answer:

function find_repeating_sequences_re($s)

{

$res = array();

preg_match_all('/(?=(.+).*\1)/', $s, $matches);

foreach ($matches[1] as $match) {

$length = strlen($match);

if ($length > 1) {

for ($i = 0; $i < $length; ++$i) {

for ($j = $i; $j < $length; ++$j) {

$res[substr($match, $i, $j - $i + 1)] = 1;

}

}

} else {

$res[$match] = 1;

}

}

return array_keys($res);

}

我让他们在800字节随机数据的小基准测试中解决它:

$data = base64_encode(openssl_random_pseudo_bytes(600));

每个代码运行10轮,并测量执行时间.结果?

Pure PHP - 0.014s (10 runs)

PCRE - 40.86s

当你看到24k字节(或真正高于1k的任何东西)时,它会变得更奇怪:

Pure PHP - 4.565s (10 runs)

PCRE - 0.232s

事实证明,正则表达式在1k个字符之后崩溃,因此$matches数组为空.这些是我的.ini设置:

pcre.backtrack_limit => 1000000 => 1000000

pcre.recursion_limit => 100000 => 100000

我不清楚在只有1k个字符之后是如何命中回溯或递归限制的.但即使这些设置以某种方式“修复”,结果仍然很明显,PCRE似乎不是答案.

我想用C语写这个会加速它,但我不确定程度如何.

更新

在hakre’s answer的帮助下,我整理了一个改进版本,在优化以下内容后,性能提高了约18%:

>删除外部循环中的substr()调用以前进字符串指针;这是我之前的递归化身遗留下来的.

>将部分结果用作正缓存,以跳过内部循环内的strpos()调用.

在这里,它的一切荣耀(:

function find_repeating_sequences3($s)

{

$res = array();

$p = 0;

$len = strlen($s);

while ($p != $len) {

$pat = $s[$p]; $i = ++$p;

while ($i != $len) {

if (!isset($res[$pat])) {

if (false === strpos($s, $pat, $i)) {

break;

}

$res[$pat] = 1;

}

// expand pattern and try again

$pat .= $s[$i++];

}

}

return array_keys($res);

}

php正则重复匹配,php – 用于匹配任何长度的所有重复子串的正则表达式相关推荐

  1. php 正则提取连续字母,PHP匹配连续的数字或字母的正则表达式

    正则表达式的写法规则:"/规则需要写在2个斜杠中间/". (. :小数点)用于匹配除换行符之外的所有字符. (\s:反斜杠小写s)用于匹配单个空格符,包括tab键和换行符: (\S ...

  2. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  3. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  4. 正则基础之 NFA引擎匹配原理

    来源:http://www.jb51.net/article/19332.htm 1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱 ...

  5. mysql 替换非中文_mysql中的正则操作 匹配手机号,匹配中文,替换

    mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...

  6. python正则匹配找到所有的浮点数_Python随笔17:Python正则表达式基础(4):贪婪匹配和最小匹配...

    Python正则表达式 贪婪匹配/最小匹配 Re库默认采用贪婪匹配,即匹配最长的子字符串.在量词后面加一个"?",即可由贪婪匹配化为最小匹配. '*'用于将前面的模式匹配0次或多次 ...

  7. java 正则 惰性匹配_js正则表达式惰性匹配和贪婪匹配用法分析

    本文实例讲述了js正则表达式惰性匹配和贪婪匹配用法.分享给大家供大家参考,具体如下: 在讲贪婪模式和惰性模式之前,先回顾一下JS正则基础: 写法基础: ①不需要双引号,直接用//包含 => /w ...

  8. java正则完美匹配注释_匹配Email邮箱的正则表达式(完美经典)

    匹配Email邮箱格式的正则表达式: /^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a ...

  9. mysql中的正则操作 匹配手机号,匹配中文,替换

    mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...

最新文章

  1. CentOS 7-(64位)系统下安装Anaconda(Python3.x)及pip使用
  2. Prokka:快速原核基因组、宏基因组基因注释
  3. Java程序设计经典习题15道
  4. 为什么说大盘很健康?
  5. Linux脚本关联,shell数组和关联数组
  6. 洛谷 - P1308 统计单词数(字符串+模拟)
  7. oracle 创建view时,授权给用户
  8. 前端学习(2045)vue之电商管理系统电商系统之优化chainwebpack自定义打包入口
  9. 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
  10. 路由器上的lookback是什么?有什么作用?
  11. 深度学习13-cnn介绍(卷积神经网络简介)
  12. Mysql BLOB和TEXT类型
  13. 考软考信息处理技术员之前,这些问题你要知道!
  14. 单片机C语言编程实例分析详解,单片机C语言编程的八个基本规则解析
  15. 会员数据化运营应用场景与分析模型
  16. 推荐一些可以获取免费的国外的原版书籍(电子版)网站
  17. 汇编DOS与Windows Masm编译运行代码步骤详解
  18. (转)MSDN Library “已取消到该网页的导航”解决办法
  19. NLP比赛-小布助手对话短文本语义匹配
  20. 2022.1.25复盘

热门文章

  1. android--service之aidl传递复杂对象,Android--Service之AIDL传递复杂对象
  2. 前n个正整数相乘的时间复杂度为_初一数学必学必考的21个知识点,附第一章有理数测试卷...
  3. unity小工具 创建常用文件夹
  4. LeetCode——16. 3Sum Closest
  5. Leetcode代码练习(三)
  6. python list操作说明
  7. pepflashplayer32_25_0_0_127.dll: 0x59952C6D is not a valid instance ID.
  8. Oracle表空间规划处理
  9. 【freemarker】渲染列表一系列操作
  10. bzoj1854 [Scoi2010]游戏——匈牙利算法