You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用preg_match_all统计特定单词出现后另一指定单词的出现次数

正确匹配规则

使用如下正则即可匹配到world之后出现的所有hello:

/(?:world|\G(?!^)).*?\Khello/s

规则说明

  • 末尾的s是正则修饰符,作用是让通配符.可以匹配换行符,适配多行文本场景
  • (?:world|\G(?!^))为非捕获组,匹配两种合法起始位置:
    • 首次匹配从文本中出现world的位置开始
    • 后续匹配从上一次匹配成功的结束位置开始,\G(?!^)排除了文本起始位置,避免匹配到world之前的hello
  • .*?是非贪婪匹配,匹配任意长度的任意字符,直到遇到下一个hello
  • \K的作用是重置匹配结果,丢弃前面匹配到的所有内容,最终只将hello计入匹配结果列表

调用示例

$text = 'blah blah blah
hello
blah blah blah
class="world" 
blah blah blah
hello 
blah blah
hello
blah blah blah
hello
blah blah blah';

preg_match_all('/(?:world|\G(?!^)).*?\Khello/s', $text, $matches);
$resultCount = count($matches[0]);
//  $resultCount 的值为预期的3

原有写法问题说明

  • world.+(hello)使用贪婪匹配,.+会一直匹配到文本末尾,再回退查找最后一个hello,因此只能得到1个匹配结果
  • world.*?(hello)使用非贪婪匹配,单次匹配找到第一个hello就停止,全局匹配时每次都从world的起始位置重新查找,因此也只能得到1个匹配结果

内容的提问来源于stack exchange,提问作者limestreetlab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:15:04