R Regex Повторение - PullRequest
       4

R Regex Повторение

0 голосов
/ 04 декабря 2018

Работая с главой R4DS Strings, я запутался в следующем примере регулярного выражения:

x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"

str_view(x, "C?")

Этот код не возвращает совпадений

Использование ? Как я понимаю, определяет совпадение 0или 1 раз и повторение является «жадным» и будет соответствовать самой длинной возможной строке, так почему же 1 «C» не соответствует?

Кроме того, приведенный ниже код соответствует первому «CC»:

x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"

str_view(x, "CC?")

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Это потому, что движок регулярных выражений сдастся, если сможет.Только с одним необязательным символом вы ничего не просите.Регулярное выражение выполняется в позиции 0, «C» пробуется и не обнаруживается, но является необязательным.

С двумя символами жесткое «C» заставляет двигатель двигаться вправо, так как вы 'фактически запрашивает что-то, и вбрасывается вторая буква «С», поскольку это следующий (необязательный) символ.

0 голосов
/ 04 декабря 2018

Есть совпадение для str_view(x, "C?"), но оно имеет длину 0. Полезно проанализировать это поведение с помощью функции базового R regexpr.

regexpr("C?", x)
# [1] 1
# attr(,"match.length")
# [1] 0
# attr(,"useBytes")
# [1] TRUE

Это говорит о том, что совпадение начинается в позиции1 и имеет длину 0. Поскольку C? означает C один раз или ноль раз, он соответствует пустой строке в начале x.

regexpr("CC?", x)
# [1] 47
# attr(,"match.length")
# [1] 2
# attr(,"useBytes")
# [1] TRUE

В отличие от этого, регулярное выражение CC? соответствует строке, начинающейся в позиции 47 с длиной 2. Поскольку необходим первый C, он не может соответствовать пустой строке.Поскольку ? является жадным, CC? соответствует как первому, так и второму C из x.

0 голосов
/ 04 декабря 2018

Я думаю, что он возвращает совпадение, но это пустая строка.

Объяснение:

  1. Движок регулярных выражений запускается с проверки соответствия первого символа
  2. M не соответствует C.
  3. Но подождите, C необязательно.
  4. Пустая строка соответствует.
  5. Успех!

С другой стороны, CC? не может совпадать в начале строки, поэтому движок должен шагать по строке, пока не найдет первое C, а затем будет совпадать независимо от того, сколько C s есть.

Мораль: никогда не создавайте регулярное выражение, где все токены являются необязательными, и допускается пустое совпадение (если вы не планируете делать именно это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...