正则表达式 - 和 中的差值



很抱歉在互联网上添加了另一个"正则表达式解释"问题,但我必须知道其中的原因。我已经通过 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] - 查找不是新行的所有字符

相关内容

  • 没有找到相关文章

最新更新