php正则重复匹配,php – 用于匹配任何长度的所有重复子串的正则表达式
你的问题是递归的…你知道吗,忘了递归! = 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 – 用于匹配任何长度的所有重复子串的正则表达式相关推荐
- php 正则提取连续字母,PHP匹配连续的数字或字母的正则表达式
正则表达式的写法规则:"/规则需要写在2个斜杠中间/". (. :小数点)用于匹配除换行符之外的所有字符. (\s:反斜杠小写s)用于匹配单个空格符,包括tab键和换行符: (\S ...
- 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...
目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk print 交给bash awk中运行shell命 ...
- 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符
目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk print 交给bash awk中运行shell命 ...
- 正则基础之 NFA引擎匹配原理
来源:http://www.jb51.net/article/19332.htm 1 为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱 ...
- mysql 替换非中文_mysql中的正则操作 匹配手机号,匹配中文,替换
mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...
- python正则匹配找到所有的浮点数_Python随笔17:Python正则表达式基础(4):贪婪匹配和最小匹配...
Python正则表达式 贪婪匹配/最小匹配 Re库默认采用贪婪匹配,即匹配最长的子字符串.在量词后面加一个"?",即可由贪婪匹配化为最小匹配. '*'用于将前面的模式匹配0次或多次 ...
- java 正则 惰性匹配_js正则表达式惰性匹配和贪婪匹配用法分析
本文实例讲述了js正则表达式惰性匹配和贪婪匹配用法.分享给大家供大家参考,具体如下: 在讲贪婪模式和惰性模式之前,先回顾一下JS正则基础: 写法基础: ①不需要双引号,直接用//包含 => /w ...
- java正则完美匹配注释_匹配Email邮箱的正则表达式(完美经典)
匹配Email邮箱格式的正则表达式: /^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a ...
- mysql中的正则操作 匹配手机号,匹配中文,替换
mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...
最新文章
- CentOS 7-(64位)系统下安装Anaconda(Python3.x)及pip使用
- Prokka:快速原核基因组、宏基因组基因注释
- Java程序设计经典习题15道
- 为什么说大盘很健康?
- Linux脚本关联,shell数组和关联数组
- 洛谷 - P1308 统计单词数(字符串+模拟)
- oracle 创建view时,授权给用户
- 前端学习(2045)vue之电商管理系统电商系统之优化chainwebpack自定义打包入口
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- 路由器上的lookback是什么?有什么作用?
- 深度学习13-cnn介绍(卷积神经网络简介)
- Mysql BLOB和TEXT类型
- 考软考信息处理技术员之前,这些问题你要知道!
- 单片机C语言编程实例分析详解,单片机C语言编程的八个基本规则解析
- 会员数据化运营应用场景与分析模型
- 推荐一些可以获取免费的国外的原版书籍(电子版)网站
- 汇编DOS与Windows Masm编译运行代码步骤详解
- (转)MSDN Library “已取消到该网页的导航”解决办法
- NLP比赛-小布助手对话短文本语义匹配
- 2022.1.25复盘
热门文章
- android--service之aidl传递复杂对象,Android--Service之AIDL传递复杂对象
- 前n个正整数相乘的时间复杂度为_初一数学必学必考的21个知识点,附第一章有理数测试卷...
- unity小工具 创建常用文件夹
- LeetCode——16. 3Sum Closest
- Leetcode代码练习(三)
- python list操作说明
- pepflashplayer32_25_0_0_127.dll: 0x59952C6D is not a valid instance ID.
- Oracle表空间规划处理
- 【freemarker】渲染列表一系列操作
- bzoj1854 [Scoi2010]游戏——匈牙利算法