Ваш шаблон ([^\\n])(\s{1})?
в regex101 (PCRE) соответствует строкам, отличным от того же шаблона, который использовался в gsub
без perl=TRUE
(то есть, когда он обрабатывается библиотекой регулярных выражений TRE). Они будут работать так же, если вы используете perl=TRUE
и gsub("([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
.
Что такого особенного в PCRE Regex ([^\\n])(\s{1})
?
Этот шаблон в тестере регулярных выражений с параметром PCRE соответствует:
([^\\n])
- любой символ, кроме \
и n
(помещен в группу 1)
(\s{1})?
- сопоставляет и фиксирует в Группе 2 любой одиночный пробельный символ, по выбору, 1 или 0 раз.
Обратите внимание, что этот шаблон не соответствует ни одному символу, не являющемуся новой строкой, с первой группой захвата, он будет соответствовать любому символу, не являющемуся новой строкой, если бы он был [^\n]
.
Теперь то же регулярное выражение с gsub
будет
gsub("([^\n])(\\s{1})?", "\\1", S1) # OR
gsub("([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
Почему различное количество обратных косых черт? Поскольку первый регулярное выражение обрабатывается с помощью библиотеки регулярных выражений TRE, и в этих шаблонах внутри выражений в скобках никакие экранированные выражения не анализируются как таковые, \
и n
рассматриваются как 2 отдельных символа. В шаблоне PCRE шаблон с perl=TRUE
, [...]
называется классами символов , и внутри них вы можете определить экранирование регулярного выражения, и, таким образом, экранирующий символ \
должен быть удвоен (что в строковом литерале R он должен быть увеличен в четыре раза, так как вам нужно \
для экранирования \
, чтобы механизм R "видел" обратную косую черту).
На самом деле, если вы хотите сопоставить символ новой строки, вам просто нужно использовать \n
в шаблоне регулярных выражений, вы можете использовать "\n"
или "\\n"
, так как оба механизма TRE и PCRE для регулярных выражений анализируют LF и \n
regex escape как шаблон соответствия символов новой строки. Эти четыре эквивалентны:
gsub("\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
gsub("\\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
Если \n
должен быть необязательным, просто добавьте квантификатор ?
после него, нет необходимости заключать его в группу:
gsub("\n?([^\n])(\\s{1})?", "\\1", S1)
^
И еще более упростить его:
gsub("\n?([^\n])\\s?", "\\1", S1)
А также, если по [^\n]
вы хотите сопоставить любой символ, кроме новой строки, просто используйте .
с (?n)
встроенным модификатором:
gsub("(?n)(.)(\\s{1})?", "\\1", S1)
См. R демо онлайн .