2015-06-13 2 views
2

Извините, что добавили еще один вопрос «Regex explain» в Интернет, но я должен знать причину этого. Я запустил это регулярное выражение через RegexBuddy и Regex101.com без какой-либо помощи.Regex - разница в \ n и n

Я натолкнулся на следующее регулярное выражение ("%4d%[^\\n]") при отладке функции разбора времени. Время от времени я получал ошибку «недействительной даты», но только в течение месяцев января и июня. Я издевался над некоторым кодом, чтобы воссоздать именно то, что происходило, но я не могу понять, почему удаление одной косой черты это исправляет.

<?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/>'; 
} 
?> 

Не стесняйтесь запускать это локально, но только два выхода, о которых я беспокоюсь, - это месяцы июня и января. "%4d%[^\\n]" усечет $rest_of_string к /Ju и /Ja в то время как "%4d%[^\n]" отображает остаток строки, как и ожидалось (/Jan/03 & /Jun/22).

Вот моя интерпретация неисправного регулярное выражение:

  • %4d% - Получить четыре цифры.
  • [^\\n] - Ищите эти цифры между началом строки и новой строкой.

Может кто-нибудь исправить мои объяснения и/или сказать мне, почему удаление косой черты дает мне результат, который я ожидаю?

Мне все равно, КАК ... Мне нужно ПОЧЕМУ.

+0

Это 'sscanf' синтаксис, это не имеет ничего общего с регулярным выражением :) –

+0

@LucasTrzesniewski теперь я чувствую себя глупо, но меньше ума. Я выслежу некоторую документацию формата sscanf. – lampposteffect

ответ

1

Как @LucasTrzesniewski указал, что это sscanf() синтаксис, он не имеет ничего общего с Regex. Формат объясняется на странице sprintf().

В вашем шаблоне "%4d%[^\\n]", два \\ перевести на один символ обратной косой черты. Таким образом, правильная интерпретация «неисправной» схемы:

  • %4d - Получить четыре цифры.
  • %[^\\n] - Посмотрите на все символы, которые не обратная косая черта или буква «п»

Вот почему он не соответствует все вплоть до «п» в «Ян» и «Июнь».

Правильная картина "%4d%[^\n]", где \ п переводит к новой строки, и это интерпретация:

  • %4d - Получить четыре цифры.
  • %[^\n] - Посмотрите на все символы, которые не новая линия
+0

Как @LucasTrzesniewski сказал выше, является ли этот синтаксис специфичным для sscanf? Или это действительно регулярное выражение? – lampposteffect

+0

Вы правы, это синтаксис 'sscanf()'. Я обновил свой ответ. –