给出主题
AB: CD:DEF: HIJ99:message packet - no capture
我制作了以下正则表达式来正确捕获2-5个字符的目标,后面跟着一个冒号。
/\s{0,1}([0-9a-zA-Z]{2,5}):\s{0,1}/
即使在目标
之前或之后添加了错误空格,也会返回我的匹配项[0] => AB
[1] => CD
[2] => DEF
[3] => HIJ99
但是,如果消息包在任何地方都包含冒号,例如
AB: CD:DEF: HIJ99:message packet no capture **or: this either**
当然在结果集中包含[4] => or
,这是不可取的。我想从一开始就将匹配限制为一个连续的集合,然后一旦我们失去并发性,停止在余数中寻找更多的匹配
编辑1:
还尝试^(\s{0,1}([0-9a-zA-Z]{2,5}):\s{0,1}){1,5}
强制从字符串的开头检查多个匹配,但后来我丢失了单独的匹配
[0] => Array
(
[0] => AB: CD:DEF: HIJ99:
)
[1] => Array
(
[0] => HIJ99:
)
[2] => Array
(
[0] => HIJ99
)
编辑2: 请记住,主题不是固定的。
AB: CD:DEF: HIJ99:message packet - no capture
可以很容易
ZY:xw:VU:message packet no capture or: this either
我们试图拉动的比赛,主题也是可变的。只是想过滤掉匹配"的概率:"在消息包中
答案 0 :(得分:1)
怎么样:
$str = 'AB: CD:DEF: HIJ99:message packet no capture or: this either';
preg_match_all('/(?<![^:]{7})([0-9a-zA-Z]{2,5}):/', $str, $m);
print_r($m);
<强>输出:强>
Array
(
[0] => Array
(
[0] => AB:
[1] => CD:
[2] => DEF:
[3] => HIJ99:
)
[1] => Array
(
[0] => AB
[1] => CD
[2] => DEF
[3] => HIJ99
)
)
答案 1 :(得分:1)
您可以使用\G
进行连续字符串匹配。
$str = 'AB: CD:DEF: HIJ99:message packet no capture or: this either';
preg_match_all('/\G\s*([0-9a-zA-Z]{2,5}):\s*/', $str, $m);
print_r($m[1]);
输出:
Array
(
[0] => AB
[1] => CD
[2] => DEF
[3] => HIJ99
)