正则表达式 - \\n 和 \n 的区别

Regex - the difference in \\n and \n

很抱歉向互联网添加另一个 "Regex explanation" 问题,但我必须知道这样做的原因。我通过 RegexBuddy 运行 这个正则表达式 Regex101.com 没有任何帮助。

我在调试时间解析函数时遇到了以下正则表达式 ("%4d%[^\n]")。我时不时会收到 'invalid date' 错误,但仅在一月和六月期间出现。我模拟了一些代码来准确地重现正在发生的事情,但我不明白为什么删除一个斜杠可以修复它。

<?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).

这是我对错误正则表达式的解释:

任何人都可以纠正我的解释 and/or 告诉我为什么删除斜杠会得到我期望的结果?

我不关心如何...我需要为什么。

就像@LucasTrzesniewski 指出的那样,那是 sscanf() syntax, it has nothing to do with Regex. The format is explained in the sprintf() 页。

在您的模式 "%4d%[^\n]" 中,两个 \ 转换为一个反斜杠字符。所以 "faulty" 模式的正确解释是:

  • %4d - 获取四位数。
  • %[^\n] - 查找不是反斜杠或字母 "n"
  • 的所有字符

这就是为什么它匹配 "Jan" 和 "Jun" 中的 "n" 之前的所有内容。

正确的模式是"%4d%[^\n]",其中\n转换为换行符,它的解释是:

  • %4d - 获取四位数。
  • %[^\n] - 查找所有不是新行的字符