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

如何编写正则表达式提取含//的组合词及对应描述?

PHP正则匹配处理//分隔的大写词,生成多键对应同值的数组

我来帮你搞定这个问题!你现在的需求是从文本里提取大写词作为数组键,右侧的描述作为对应值,但遇到WORD//WORD 描述这种用//分隔的组合词时,原有代码没法让每个分隔后的词都对应同一个描述。下面一步步来解决:

示例文本

假设你的输入文本是这样的:

FOO//BAR//BAZ 这是一段描述文本
QUX 另一段描述

原有代码

你之前的代码大概是类似这样的(没法正确处理//分隔的情况):

$text = "FOO//BAR//BAZ 这是一段描述文本\nQUX 另一段描述";
$pattern = '/([A-Z]+) (.*)/';
preg_match_all($pattern, $text, $matches);

$result = [];
foreach ($matches[1] as $index => $key) {
    $result[$key] = $matches[2][$index];
}

print_r($result);

错误结果

运行原有代码后,得到的错误结果只能匹配到第一个大写词,其他被//分隔的词都被忽略了:

Array
(
    [FOO] => 这是一段描述文本
    [QUX] => 另一段描述
)

期望结果

你想要的正确结果应该是每个//分隔的大写词都对应同一个描述:

Array
(
    [FOO] => 这是一段描述文本
    [BAR] => 这是一段描述文本
    [BAZ] => 这是一段描述文本
    [QUX] => 另一段描述
)

解决方案

我们需要修改正则表达式,先匹配所有用//分隔的大写词组合,再把它们拆分成单个键,最后对应到同一个描述上。

修正后的正则表达式

使用这个正则来匹配每行的内容:

/([A-Z]+(?:\/\/[A-Z]+)*) (.*)/m

正则解释:

  • [A-Z]+:匹配单个由大写字母组成的词
  • (?:\/\/[A-Z]+)*:这是一个非捕获组,用来匹配任意多个//+大写词的组合,*表示这个组合可以出现0次或多次(这样既能匹配FOO//BAR//BAZ,也能匹配单个的QUX)
  • 整个捕获组1会拿到完整的大写词组合(比如FOO//BAR//BAZ)
  • (.*):匹配该行中大写词组合后面的所有描述文本,作为捕获组2
  • 末尾的m是多行模式,确保每行的内容都能被正确匹配

修正后的PHP代码

$text = "FOO//BAR//BAZ 这是一段描述文本\nQUX 另一段描述";
// 匹配每行的大写词组合和对应的描述
$pattern = '/([A-Z]+(?:\/\/[A-Z]+)*) (.*)/m';
preg_match_all($pattern, $text, $matches);

$result = [];
foreach ($matches[1] as $index => $keyGroup) {
    // 把用//分隔的键拆分成单个键
    $keys = explode('//', $keyGroup);
    $description = $matches[2][$index];
    // 给每个键赋值同一个描述
    foreach ($keys as $key) {
        $result[$key] = $description;
    }
}

print_r($result);

运行这段代码后,就能得到你期望的结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:45