在每个数字序列之后拆分字母数字字符串

问题描述 投票:0回答:3

我有一系列形式为

的字符串
10a99b5c
55
2a3b1
g

如何按字符拆分字符串(这些字符始终显示为数字之间或字符串的开头/结尾中的单个字符)

array([0] => 10a99b5c, [1] => 10, [2]=> a99, [3] => b5, [4] => c),
array([0] => 55, [1] => 55),
array([0] => 2a3b1, [1] => 2, [2] => a3, [3] => b1),
array([0] => g, [1] => g),

输出格式并不重要,我可以处理,我只是不知道什么样的正则表达式模式可以做到这一点(即使提示就足够了)。

我使用

preg_replace_callback
执行此操作,其中我使用为每个字符找到的数字进行一组计算。

php regex split text-parsing preg-split
3个回答
1
投票

试试这个:

$input = ['10a99b5c','55','2a3b1','g'];
$regEx = '~([a-z]\d*)~';

foreach($input as $str){
  $res[] = preg_split($regEx,$str,-1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}
echo '<pre>';
var_export($res);

上述示例的结果:

array (
  0 => 
  array (
    0 => '10',
    1 => 'a99',
    2 => 'b5',
    3 => 'c',
  ),
  1 => 
  array (
    0 => '55',
  ),
  2 => 
  array (
    0 => '2',
    1 => 'a3',
    2 => 'b1',
  ),
  3 => 
  array (
    0 => 'g',
  ),
) 

1
投票

正则表达式:

/[a-z]*[0-9]*/

  • [a-z] 将匹配任何(小写)字符
    • 零次或多次
  • [0-9] 将匹配一个数字
    • 零次或多次

https://regex101.com/r/Ox4yUh/1


0
投票

您的任务很简单,在每个数字序列后面的零宽度位置进行分割。

$array = preg_split('/\d+\K/', $string, 0, PREG_SPLIT_NO_EMPTY);

\d+
匹配数字,然后用
\K
释放它们,这样数字在爆炸过程中就不会被“消耗”。

我会将您的四个示例字符串捆绑到测试字符串数组中。

代码:(演示

$strings = [
    '10a99b5c',
    '55',
    '2a3b1',
    'g',
];

var_export(
    array_map(
        fn($string) => preg_split('/\d+\K/', $string, 0, PREG_SPLIT_NO_EMPTY),
        $strings
    )
);

输出:

array (
  0 => 
  array (
    0 => '10',
    1 => 'a99',
    2 => 'b5',
    3 => 'c',
  ),
  1 => 
  array (
    0 => '55',
  ),
  2 => 
  array (
    0 => '2',
    1 => 'a3',
    2 => 'b1',
  ),
  3 => 
  array (
    0 => 'g',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.