Php Regex-中的差异\\n和\n

Php Regex-中的差异\\n和\n,php,regex,datetime,syntax,scanf,Php,Regex,Datetime,Syntax,Scanf,很抱歉在互联网上添加另一个“Regex解释”问题,但我必须知道原因。我在没有帮助的情况下通过RegexBuddy和Regex101.com运行了这个正则表达式 在调试时间解析函数时,我遇到了以下正则表达式(%4d%[^\\n]“)。我偶尔会收到一个“无效日期”错误,但仅限于1月和6月。我模拟了一些代码来准确地再现正在发生的事情,但我不明白为什么删除一个斜杠可以修复它 <?php $format = '%Y/%b/%d'; $random_date_strings = array(

很抱歉在互联网上添加另一个“Regex解释”问题,但我必须知道原因。我在没有帮助的情况下通过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\u字符串
截断为
/Ju
/Ja
%4d%[^\n]”
按预期显示字符串的其余部分(
/Jan/03
&
/Jun/22

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

  • %4d%
    -获取四位数字
  • [^\\n]
    -查找字符串开头和新行之间的数字
谁能纠正我的解释和/或告诉我为什么删除斜杠会得到我期望的结果


我不关心如何…我需要原因。

就像@lucastzesniewski指出的,这是语法,它与正则表达式无关。本页对格式进行了说明

在模式
%4d%[^\\n]“
中,两个
\\
转换为一个反斜杠字符。因此,“错误”模式的正确解释是:

  • %4d
    -获取四位数字
  • %[^\\n]
    -查找所有不是反斜杠或字母“n”的字符
这就是为什么在“Jan”和“Jun”中的“n”之前它会匹配所有内容

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

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

这是
sscanf
语法,它与正则表达式无关:)@lucastrezesniewski我觉得很傻,但现在不那么疯狂了。我会找到一些sscanf格式的文档。就像上面@lucastzesniewski所说的,这种语法是针对sscanf的吗?或者这实际上是正则表达式?你是对的,这是
sscanf()
语法。我已经更新了我的答案。