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

如何使用preg_match匹配中间含任意数量单词的相似文本模式?

解决"Where"与"find train station"间任意多单词的正则匹配问题

嘿,你的问题根源在于原正则的匹配范围太窄啦!原表达式里的([^\s]+)只能匹配单个不含空格的单词,所以当中间有多个单词时自然就匹配失败了。

要实现匹配中间一个或多个单词的需求,我们可以调整正则规则,让它能覆盖任意数量的单词(包括单词间的空格)。这里给你两种可行的方案:

方案1:灵活匹配(允许中间有任意字符,适合大多数场景)

用非贪婪模式的.+?来匹配"Where"和"find train station"之间的所有内容,简单直接:

$lines = "Where can I find train station";
$pattern = "/Where (.+?) find train station/i";
preg_match($pattern, $lines, $matches);
var_dump($matches);
// 输出:array(2) { [0]=> string(29) "Where can I find train station" [1]=> string(5) "can I" }

方案2:精准匹配(仅匹配单词,排除特殊字符)

如果你需要严格只匹配字母数字组成的单词,可以用非捕获组来组合"单词+空格"的模式,确保只捕获合法单词:

$lines = "Where can i and you and me find train station";
// (?:\w+\s+)* 匹配零次或多次"单词+空格",最后用\w+匹配结尾的单词
$pattern = "/Where ((?:\w+\s+)*\w+) find train station/i";
preg_match($pattern, $lines, $matches);
var_dump($matches);
// 输出:array(2) { [0]=> string(45) "Where can i and you and me find train station" [1]=> string(21) "can i and you and me" }

关键修改点说明:

  • 保留i修饰符,实现大小写不敏感匹配,比如能匹配"Where Can I..."或者"where CAN i..."
  • 方案1的.+?是非贪婪匹配,会在遇到第一个"find train station"时停止,避免匹配过多内容
  • 方案2的(?:...)是非捕获组,不会额外生成捕获结果,只用来组合匹配规则,让捕获组只保留我们需要的中间单词内容

这两个方案都能完美支持你提到的所有测试场景,包括中间1个单词、多个单词的情况,你可以根据实际需求选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:03:47