匹配模式,排除其他所有内容

时间:2013-10-26 22:46:11

标签: php regex

我有一些如下所示的数据。

\\0101 \\0102 \\0103 \\0104
\\0201 \\0202 \\0203 \\0204 \\0205 \\0206
\\0301 \\0302 \\0303 \\0304 \\0305 \\0306

我需要始终在行中的最后一个\\之前获取数字。

所以在上面的行中,我的输出应该是。

0103
0205
0305

我匹配这些数字,但它也匹配最后一组。

(?<=\\\\)\d+(?: \\\\\d+$)

如何排除除这些数字之外的所有其他内容?

3 个答案:

答案 0 :(得分:3)

你很接近,而不是使用非捕获组(?:使用正向前瞻。

(?<=\\\\)\d+(?= +\\\\\d+$)

请参阅live demo

答案 1 :(得分:3)

有很多方法可以做到这一点,但要纠正你的正则表达式,只需在目标数字上添加一个捕获组

(?<=\\\\)(\d+)(?: \\\\\d+$)

Live DEMO

另一个(可以更简化):

\\\\(\d+)\s+[\d\\]+$

Live DEMO

答案 2 :(得分:2)

如果您的数据总是采用相同的形式,那么后视是无用的。你可以试试这个:

$subject = <<<'LOD'
\\0101 \\0102 \\0103 \\0104
\\0201 \\0202 \\0203 \\0204 \\0205 \\0206
\\0301 \\0302 \\0303 \\0304 \\0305 \\0306
LOD;

preg_match_all('~\d+(?=\D+\d+$)~m', $subject, $matches);

print_r($matches);