我需要一个以下模式的正则表达式:
来自[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
)
)
感谢。
答案 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(?!^)
)或(|
)后面的位置e
,f
或{ {1}}字母后跟1位数字,1次出现(由于g
正向前瞻)(?=(?:[e-g]\d+)+c)
- [e-g]\d+
,e
或f
后跟1位数字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',
),
)