考虑我有这个字符串'aaaabbbaaaaaabbbb'
我想将它转换为数组,以便得到以下结果
$array = [
'aaaa',
'bbb',
'aaaaaa',
'bbbb'
]
如何在PHP中解决这个问题?
答案 0 :(得分:5)
正则表达式:x
fn main() {
let (x, y) = (1, 3);
println!("X is {} and Y is {}", x, y);
let x: i32 = 565;
println!("Now X is {}", x);
}
:匹配并捕获单个字符。
(.)\1{1,}
:这将包含第一场比赛
(.)
:使用匹配的字符一次或多次。
\1
<强>输出:强>
\1{1,}
或强>
<?php
ini_set("display_errors", 1);
$string="aaaabbbaaaaaabbbb";
preg_match_all('/(.)\1{1,}/', $string,$matches);
print_r($matches);
<强>输出:强>
Array
(
[0] => Array
(
[0] => aaaa
[1] => bbb
[2] => aaaaaa
[3] => bbbb
)
[1] => Array
(
[0] => a
[1] => b
[2] => a
[3] => b
)
)
答案 1 :(得分:0)
我只使用preg_split()编写了一行内容,生成了没有浪费内存的预期结果(没有阵列膨胀):
代码(Demo):
$string='aaaabbbaaaaaabbbb';
var_export(preg_split('/(.)\1*\K/',$string,NULL,PREG_SPLIT_NO_EMPTY));
输出:
array (
0 => 'aaaa',
1 => 'bbb',
2 => 'aaaaaa',
3 => 'bbbb',
)
模式:
(.) #match any single character
\1* #match the same character zero or more times
\K #keep what is matched so far out of the overall regex match
真正的魔法发生在\K
,更多阅读here。
NULL
中的preg_split()
参数表示“无限制匹配”。这是默认行为,但它需要在函数中保留其位置,以便下一个参数适当地用作flag
最后一个参数是PREG_SPLIT_NO_EMPTY
,它会删除所有空匹配。
Sahil的preg_match_all()方法preg_match_all('/(.)\1{1,}/', $string,$matches);
是一个很好的尝试,但由于两个原因它并不完美:
第一个问题是他使用preg_match_all()
返回两个子阵列,这是必要结果的两倍。
$string="abbbaaaaaabbbb";
时会显示第二个问题。他的方法将忽略第一个孤独的角色。这是它的输出:
Array (
[0] => Array
(
[0] => bbb
[1] => aaaaaa
[2] => bbbb
)
[1] => Array
(
[0] => b
[1] => a
[2] => b
)
)
Sahil的第二次尝试产生了正确的输出,但需要更多的代码。更简洁的非正则表达式解决方案可能如下所示:
$array=str_split($string);
$last="";
foreach($array as $v){
if(!$last || strpos($last,$v)!==false){
$last.=$v;
}else{
$result[]=$last;
$last=$v;
}
}
$result[]=$last;
var_export($result);