一个正则表达式,用于匹配单个字符,后跟数字,以“c”结尾

时间:2018-01-25 08:31:12

标签: php regex

我需要一个以下模式的正则表达式:

来自[e-g]的单个字符,后跟一个或多个以字符'c'结尾的数字。

例如,

e123f654g933c  预期结果:

Array
(
    [0] => Array
        (
            [0] => e123
            [1] => f654
            [2] => g933
        )

)

e123f654g933ce99f77g66c 预期结果:

Array
(
    [0] => Array
        (
            [0] => e123
            [1] => f654
            [2] => g933
        ),
    [1] => Array
        (
            [0] => e99
            [1] => f77
            [2] => g66
        )

)

我尝试使用以下内容,但我不知道如何处理“c”部分。 我用了这个([e-g] {1} [0-9] {1,} c)+但它失败了。

$subject="e123f654g933ce99f786g776c";
preg_match_all('/[e-g]{1}[0-9]{1,}/', $subject, $match);
print '<pre>' . print_r($match,1) . '</pre>';

Array
(
    [0] => Array
        (
            [0] => e123
            [1] => f654
            [2] => g933
            [3] => e99
            [4] => f786
            [5] => g776
        )

)

感谢。

4 个答案:

答案 0 :(得分:1)

看来你正在寻找

[e-g]\d+

<小时/> 这需要在PHP中进行匹配和提取,如此...

<?php

$strings = ['e123f654g933c', 'e123f654g933ce99f77g66c'];

$regex = '~[e-g]\d+~';

foreach ($strings as $string) {
    if (preg_match_all($regex, $string, $matches)) {
        print_r($matches[0]);
    }
}
?>

<小时/> ......和收益率

Array
(
    [0] => e123
    [1] => f654
    [2] => g933
)
Array
(
    [0] => e123
    [1] => f654
    [2] => g933
    [3] => e99
    [4] => f77
    [5] => g66
)

答案 1 :(得分:1)

您可以使用

'~(?:\G(?!^)|(?=(?:[e-g]\d+)+c))[e-g]\d+~'

请参阅regex demo。简而言之,由于(?:\G(?!^)|(?=(?:[e-g]\d+)+c))部分,[e-g]\d+只会在[e-g]\d+c的一次或多次出现时匹配。

<强>详情

  • (?:\G(?!^)|(?=(?:[e-g]\d+)+c)) - 匹配上一次成功匹配(\G(?!^))或(|)后面的位置ef或{ {1}}字母后跟1位数字,1次出现(由于g正向前瞻)
  • (?=(?:[e-g]\d+)+c) - [e-g]\d+ef后跟1位数字

PHP demo

g

答案 2 :(得分:1)

使用单个RegExp无法轻松实现此目的。 解决方案是在出现&#39; c&#39;时分割字符串,分别处理部分,然后构建结果数组:

<?php

$strings = [
    'e123f654g933c',
    'e123f654g933ce99f77g66c',
];

foreach ($strings as $input)
{
    print_r(match($input));
}

function match($input)
{
    $result = [];
    $parts  = array_filter(explode('c', $input));

    foreach ($parts as $part)
    {
        preg_match_all('~[e-g]\d+~', $part, $matches);
        $result[] = $matches[0];
    }

    return $result;
}

输出

Array
(
    [0] => Array
        (
            [0] => e123
            [1] => f654
            [2] => g933
        )
)

Array
(
    [0] => Array
        (
            [0] => e123
            [1] => f654
            [2] => g933
        )
    [1] => Array
        (
            [0] => e99
            [1] => f77
            [2] => g66
        )
)

答案 3 :(得分:1)

我无法通过单个正则表达式函数调用生成多维输出数组。

代码(演示:https://3v4l.org/f5nnk

$strings=[
    'e123f654g933c',
    'e123f654g933ce99f77g66c'
];

foreach($strings as $string){
    var_export(
        array_map(
            function($v){
                return preg_match_all('/[e-g]\d+/',$v,$out2)?$out2[0]:[];  // split the groups by string format
                // or return preg_split('/\d+\K/',$v,NULL,PREG_SPLIT_NO_EMPTY);
                // or return preg_split('/(?=[e-g])/',$v,NULL,PREG_SPLIT_NO_EMPTY);

            },
            preg_match_all('/(?:[e-g]\d+)+(?=c)/',$string,$out1)?$out1[0]:[]  // split into groups using c
            // or explode('c',rtrim($string,'c'))
            // or array_slice(explode('c',$string),0,-1)
            // or preg_split('/c/',$string,NULL,PREG_SPLIT_NO_EMPTY)
        )
    );
    echo"\n\n";
}

输出:

array (
  0 => 
 array (
    0 => 'e123',
    1 => 'f654',
    2 => 'g933',
  ),
)

array (
  0 => 
  array (
    0 => 'e123',
    1 => 'f654',
    2 => 'g933',
  ),
  1 => 
  array (
    0 => 'e99',
    1 => 'f77',
    2 => 'g66',
  ),
)