正则表达式 - \\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
).
这是我对错误正则表达式的解释:
%4d%
- 获取四位数。
[^\n]
- 查找字符串开头和新行之间的那些数字。
任何人都可以纠正我的解释 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]
- 查找所有不是新行的字符
很抱歉向互联网添加另一个 "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
).
这是我对错误正则表达式的解释:
%4d%
- 获取四位数。[^\n]
- 查找字符串开头和新行之间的那些数字。
任何人都可以纠正我的解释 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]
- 查找所有不是新行的字符