Репликация выражения регулярного выражения с использованием пакета Rebus в R

#r #regex

#r #регулярное выражение

Вопрос:

Я хотел бы создать шаблон для следующей текстовой строки, используя rebus пакет в R.

Мои попытки приведены ниже, но я не могу удалить квадратные скобки и вернуть тот же шаблон, используя str_view() . Возможно, существует инструмент / функция, которая может реплицировать выражения регулярных выражений с использованием пакета rebus? Rebus намного проще для чтения и имеет смысл при совместном использовании кода с кем-то, кто может быть не знаком с регулярным выражением.

Шаблон с регулярным выражением:

 pattern = "http.*for-sale.*5857"
 

Я пытаюсь воспроизвести это с помощью пакета rebus:

 pattern_rebus = "http" %R% zero_or_more(ANY_CHAR) %R% "for-sale" %R% zero_or_more(ANY_CHAR) %R% "5857"

as.regex(pattern_rebus)
<regex> http[.]*for-sale[.]*5857
 

Ответ №1:

Существует ошибка в rebus том, что он обертывает все повторяющиеся символы ( one_or_more или zero_or_more ) с [ помощью и ] , класса символов. Именно поэтому .* его следует добавлять вручную.

 pattern_rebus = "http" %R% ".*" %R% "for-sale" %R% ".*5857"
as.regex(pattern_rebus)
## => <regex> http.*for-sale.*5857
 

Однако вы можете использовать обходной путь, [sS] вместо . того, чтобы сопоставлять любые символы, если вы используете регулярное выражение PCRE (с базовыми функциями регулярных выражений R) или регулярное выражение ICU (с функциями регулярных выражений stringr):

 pattern_rebus = "http" %R% zero_or_more(char_class(WRD, NOT_WRD)) %R% "for-sale" %R% zero_or_more(char_class(WRD, NOT_WRD)) %R% "5857"
as.regex(pattern_rebus)
## => <regex> http[wW]*for-sale[wW]*5857
 

Или, если вы хотите сопоставить любой символ, кроме CR и LF:

 pattern_rebus = "http" %R% zero_or_more(negated_char_class("\r\n")) %R% "for-sale" %R% zero_or_more(negated_char_class("\r\n")) %R% "5857"
as.regex(pattern_rebus)
## => <regex> http[^rn]*for-sale[^rn]*5857