正则表达式结果一致性问题


Regular Expression result consistency issue

似乎在我的PHP代码中得到了与在线编辑器非常不同的输出,以下网站都显示我的模式和字符串应该匹配。。。它显示它在以下网站中匹配:

http://www.phpliveregex.com/

https://regex101.com/

有人能在这里发现问题吗?

图案

$a= "/H('d{7})_(['d'w]*)'n(['n'w'.]*?)V($b)_('d)_('d)_('d*)(_([a-z_'d]*)($c)($c))/";

注意$b&c

字符串

$buffer =   "H2241008_1211901000000013220
R001_1
W1443.91
Maa_01D11100000000000016210053_W802.83
Mab_02D21100000000000024210054_W1323.18
Mzz_00000000000000000000000000_W0.00
T1_
V15_0_1_1210_aa225400225459_aa233900234159
V16_0_1_1210_ab192500205059_aa225500225659
V17_0_1_1210_aa225100225359_aa234200234659
V18_0_1_1210_aa224900225059_aa233800233859_aa234700240159
V19_0_1_1210_aa224400224459_aa230400230459
V303_0_1_1210_aa225700230359_aa232700233759
V402_0_1_1210_aa230800232359_aa232600232659
V450_0_1_1210_aa224500224859
V614_0_1_1210_aa224300224359_aa230500230759_aa232400232559
V65535_0_1_1210_ab192500205059_aa224300240159";
$buffer = str_replace("'r'n", "'n", $buffer);

获得匹配

preg_match_all($a, $buffer, $matches);
preg_match_all("/H('d{7})_(['d'w]*)'n(['n'w'.]*?)V(15)_('d)_('d)_('d*)(_([a-z_'d]*)(2254[0-9]{2}|500)(2254[0-9]{2}|500))/", $buffer, $output_array);
var_dump($matches);
var_dump($output_array);

我已经尝试了两种方法(检查语法和是否在模式字符串中使用变量),就像我认为$'w'n等会阻碍它一样,但两者都返回如下:

array(12) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } [3]=> array(0) { } [4]=> array(0) { } [5]=> array(0) { } [6]=> array(0) { } [7]=> array(0) { } [8]=> array(0) { } [9]=> array(0) { } [10]=> array(0) { } [11]=> array(0) { } }

我的期望;就是得到一根火柴,有11个零件。我认为这可能是PHP正则表达式与其他引擎的区别,但phpliveredex给出了与上面尝试的语法完全相同的语法($output_array),并且它的返回与预期完全相同。

请帮忙!

在正则表达式中使用'n字符(新行)。您必须确保在示例字符串中(当然还有正则表达式中,这取决于您实际想要匹配的内容)有正确的行尾。

将您的示例PHP代码复制到PSPad,然后选择Format->Unix(LF),然后将结果保存到填充的$output_array中。

如果要匹配windows样式的行尾,请将'n替换为'r'n

好吧,看起来我的$buffer有误导性。我把它粘贴在这里,它不像我在代码中那样有缩进,是缩进中的额外字符导致了问题。

我不想捣乱,但我现在不想对正则表达式的变量使用双引号——以防万一。达到预期结果。