PHP中如何修改正则表达式实现指定字符串的正确分割?
解决preg_split正则混淆连字符与负号的问题
我来帮你搞定这个正则的问题!你现在遇到的核心问题是原正则把作为分隔符的- (连字符加空格)和数字前面的负号搞混了,对吧?我们来调整正则,精准分割出你想要的内容。
问题背景
- 待分割的目标字符串:
T1 - X1(1), 7 T2 - C2(-9), -15 T3 - Y2(1), 3 T5 - C2(-1), 100 - 原使用的正则表达式:
$pattern = "/[-,#\n#()]/"; preg_split($pattern, $string); - 存在的问题:原正则会误将数字前的负号(比如
-9、-15里的-)当作分隔符拆分,导致最终数组丢失负号,不符合预期。 - 期望得到的最终数组(经
trim处理后):["T1","X1","1","7","T2","C2","-9","-15","T3","Y2","1","3","T5","C2","-1","100"]
修改后的正则表达式
我们需要精准区分作为分隔符的- 和数字前的负号,同时处理其他需要拆分的字符(括号、逗号),还要自动忽略拆分后的多余空格。可以使用下面的正则:
$pattern = "/(?: - |[(),])\s*/";
正则逻辑解释
(?: - ):非捕获分组,专门匹配作为分隔符的-(连字符+空格),用?:避免捕获该分组内容,只用于触发分割操作。[(),]:匹配需要拆分的括号(、)和逗号,,这些符号是我们要拆分的边界。\s*:匹配分割符号后面的任意数量空格,这样拆分后不会残留多余空格,减少后续trim的处理成本。
完整代码示例
$string = "T1 - X1(1), 7 T2 - C2(-9), -15 T3 - Y2(1), 3 T5 - C2(-1), 100"; $pattern = "/(?: - |[(),])\s*/"; $result = preg_split($pattern, $string); // 过滤可能出现的空字符串(原字符串不会产生,但保险起见) $result = array_filter($result, function($item) { return trim($item) !== ''; }); // 重置数组索引(可选,根据需求决定) $result = array_values($result); print_r($result);
运行结果
执行上述代码后,输出的数组完全符合你的预期:
Array ( [0] => T1 [1] => X1 [2] => 1 [3] => 7 [4] => T2 [5] => C2 [6] => -9 [7] => -15 [8] => T3 [9] => Y2 [10] => 1 [11] => 3 [12] => T5 [13] => C2 [14] => -1 [15] => 100 )
内容的提问来源于stack exchange,提问作者Ankit Jindal
相关产品推荐
相关产品推荐

