很抱歉在互联网上添加了另一个"正则表达式解释"问题,但我必须知道其中的原因。我已经通过 RegexBuddy 运行了这个正则表达式,并在没有帮助的情况下 Regex101.com。
我在调试时间解析函数时遇到了以下正则表达式("%4d%[^\n]"
)。我时不时会收到"无效日期"错误,但仅限于 1 月和 6 月。我模拟了一些代码来重现正在发生的事情,但我无法弄清楚为什么删除一个斜杠可以修复它。
<?php
$format = '%Y/%b/%d';
$random_date_strings = array(
'2015/Jan/03',
'1985/Feb/13',
'2001/Mar/25',
'1948/Apr/02',
'1948/May/19',
'2020/Jun/22',
'1867/Jul/09',
'1901/Aug/11',
'1945/Sep/21',
'2000/Oct/31',
'2009/Nov/24',
'2015/Dec/02'
);
$year = null;
$rest_of_string = null;
echo 'Bad Regex:';
echo '<br/><br/>';
foreach ($random_date_strings as $date_string) {
sscanf($date_string, "%4d%[^\n]", $year, $rest_of_string);
print_data($date_string, $year, $rest_of_string);
}
echo 'Good Regex:';
echo '<br/><br/>';
foreach ($random_date_strings as $date_string) {
sscanf($date_string, "%4d%[^n]", $year, $rest_of_string);
print_data($date_string, $year, $rest_of_string);
}
function print_data($d, $y, $r) {
echo 'Date string: ' . $d;
echo '<br/>';
echo 'Year: ' . $y;
echo '<br/>';
echo 'Rest of string: ' . $r;
echo '<br/>';
}
?>
随意在本地运行它,但我唯一关心的两个输出是 6 月和 1 月。 "%4d%[^\n]"
会将$rest_of_string
截断为 /Ju
并/Ja
,而"%4d%[^n]"
按预期显示字符串的其余部分(/Jan/03
& /Jun/22
)。
以下是我对错误正则表达式的解释:
-
%4d%
- 获取四位数。 -
[^\n]
- 在字符串开头和新行之间查找这些数字。
任何人都可以纠正我的解释和/或告诉我为什么删除斜杠会给我带来我期望的结果吗?
我不在乎如何...我需要为什么。
就像@LucasTrzesniewski指出的那样,这是sscanf()
语法,它与正则表达式无关。格式在sprintf()
页面中进行了说明。
在您的模式"%4d%[^\n]"
中,这两个\
转换为单个反斜杠字符。所以对"错误"模式的正确解释是:
-
%4d
- 获取四位数。 -
%[^\n]
- 查找所有不是反斜杠或字母"n"的字符
这就是为什么它会匹配所有内容,直到"Jan"和"Jun"中的"n"。
正确的模式是 "%4d%[^n]"
,其中 转换为换行符,其解释为:
-
%4d
- 获取四位数。 -
%[^n]
- 查找不是新行的所有字符