【问题标题】:Splitting the string based on alphabet followed by numbers根据字母后跟数字拆分字符串
【发布时间】:2016-08-09 19:13:05
【问题描述】:

我尝试拆分字符串 A1B22C333 以获取数组 [0] => A1、[1] => B22、[2] => C333。这是我失败的尝试:

$mystring = "A1B22C333";
$pattern  = "[\w\d+]";
$arr = preg_split("/".$pattern."/", $mystring);
print_r($arr);

但我得到: Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => )

【问题讨论】:

  • 有人可以帮我重命名问题的标题以防止重复吗?编辑:谢谢rock321957

标签: php regex preg-split


【解决方案1】:

我认为你应该使用 preg_match_all。

preg_match_all("/([A-Z]\d+)/", "A1B22C333", $output_array);

点击 preg_match_all
http://www.phpliveregex.com/p/fnj

【讨论】:

    【解决方案2】:

    你可以使用像这样的正则表达式

    (?<!^)(?=\D)
    

    见regex demo

    (?&lt;!^)(?=\D) 匹配不在字符串开头且在非数字字符之前的位置。

    见IDEONE demo:

    $mystring = "A1B22C333";
    $pattern  = '~(?<!^)(?=\D)~';
    $arr = preg_split($pattern, $mystring);
    print_r($arr);
    // => Array( [0] => A1    [1] => B22    [2] => C333 )
    

    如果您使用PREG_SPLIT_NO_EMPTY (demo),您还可以将正则表达式缩短为仅'~(?=\D)~'(非数字之前的位置):

    $pattern  = '~(?=\D)~';
    $arr = preg_split($pattern, $mystring, -1, PREG_SPLIT_NO_EMPTY);
    

    【讨论】:

    • 我以前从未在正则表达式中看到 ~ 字符,有人可以解释一下它的用途吗?
    • A ~ 是一个正则表达式分隔符,与/ 相同,但因为/ 经常用于模式中(然后所有/ 必须在模式中进行转义),a ~ 是一个更方便使用的分隔符。
    • 这是一个很好的提示,谢谢@Wiktor,我以后只会使用~。
    • @EdwardBlack:不要忘记在模式内转义文字 ~ 然后(模式内的everywhere)。此外,您的 [\w\d+] 不起作用,因为它匹配 1 个字母数字或文字 + 符号,并且在拆分仅包含这些字符的字符串时,您会得到预期的多个空元素数组。
    【解决方案3】:

    而不是preg_split 使用preg_match_all 以及以下正则表达式

    ([a-zA-Z]\d+)
    

    所以你的代码看起来像

    preg_match_all("/([a-zA-Z]\d+)/","A1B22C333",$m);
    print_r($m[0]);
    

    输出:

    Array
    (
        [0] => A1
        [1] => B22
        [2] => C333
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2019-08-08
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多