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

如何用正则表达式匹配字符串中可选片段的部分内容?

正则表达式匹配问题:提取姓名、量词和水果

需求场景

需要从包含特定句式的文本中提取姓名、量词和水果,测试用的核心句式如下:

Saint John eats less of those apples.
Saint Paul eats more of those berries.
Saint Luke eats         those oranges.

预期提取结果(按每条匹配项分组):

Array
(
    [0] => Array
        (
            [0] => Saint John eats less of those apples.
            [1] => John
            [2] => less
            [3] => apples
        )
    [1] => Array
        (
            [0] => Saint Paul eats more of those berries.
            [1] => Paul
            [2] => more
            [3] => berries
        )
    [2] => Array
        (
            [0] => Saint Luke eats those oranges.
            [1] => Luke
            [2] => 
            [3] => oranges
        )
)

现有代码使用的正则无法匹配最后一条无量词的句子:

preg_match_all("|Saint (.+?) eats (.+?) of those (.+?).|", $string, $matches);

实际文本会夹杂无关内容,例如:

The apples have worms. That is why Saint John eats less of those apples. Unfortunately Saint John dislikes berries. Unlike Saint Paul. Saint Paul eats more of those berries. When John and Paul are gone, Saint Luke eats those oranges. Afterward, he is still hungry.

注意:只需要处理量词部分缺失的情况,无需适配其他缺失场景。


修正方案

修正后的正则表达式

preg_match_all('/Saint (\w+) eats(?:\s+(\w+)\s+of those)?\s+(\w+)\./', $string, $matches, PREG_SET_ORDER);

正则逻辑解释

  • Saint (\w+):精准匹配"Saint "后的姓名,捕获为第1组;
  • eats:固定匹配关键词"eats";
  • (?:\s+(\w+)\s+of those)?:用非捕获组包裹可选的量词片段:
    • ?: 标记该组不单独生成匹配结果;
    • \s+(\w+)\s+of those 匹配量词(如less/more)和后续的"of those",量词被捕获为第2组;
    • ? 表示整个片段可选,对应没有量词的句式;
  • \s+(\w+)\.:匹配水果名称,捕获为第3组,最后匹配结尾的句号。

效果验证

用修正后的正则处理测试文本,会得到完全符合预期的结果:无量词的条目会在第2组返回空字符串,同时能正确过滤文本中的无关内容,只提取目标句式信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:32:42