Почему grep
обрабатывает \n
и \\n
таким же образом?
Например, оба соответствуют hallo\nworld
.
grep("hallo\nworld", pattern="\n")
[1] 1
grep("hallo\nworld", pattern="\\n")
[1] 1
Я вижу, что hallo\nworld
анализируется на
hallo
world
то есть hallo
в одной строке и world
на одной строке.
Итак, в grep("hallo\nworld", pattern="\n")
, есть ли pattern="\n"
новая строка или \n
буквально?
Также обратите внимание, что это происходит с другими; \a
\f
\n
\t
\r
и \\a
\\f
\\n
\\t
\\r
обрабатываются одинаково. Но \d
\w
\s
не может быть использован! Почему бы и нет?
Я выбрал разные строки для тестирования, и я нашел секрет в понятии регулярного выражения.
Есть два понятия побега, один - побег в строке, его просто понять; другой - escape в строке регулярного выражения шаблона. В R шаблон, такой как grep(x, pattern=" some string here ")
, \\n
= \n
= символ новой строки. Но в общей строке, \\n
!= \n
, первая буквально \n
, последняя является символом новой строки. Мы можем доказать это следующим образом:
cat("\n")
cat("\\n")
\n>
Как это доказать? Я попытаюсь использовать другие символы, а не только \n
, чтобы увидеть, совпадают ли они одинаково.
special1 <- c( "\a", "\f", "\n", "\t", "\r")
special2 <- c("\\a","\\f","\\n","\\t","\\r")
target <- paste("hallo", special1, "world", sep="")
for (i in 1:5){
cat("i=", i, "\n")
if( grep(target[i], pattern=special1[i]) == 1)
print(paste(target[i], "match", special1[i], "succeed"))
if( grep(target[i], pattern=special2[i]) == 1)
print(paste(target[i], "match", special2[i], "succeed"))
}
выход:
i= 1
[1] "hallo\aworld match \a succeed"
[1] "hallo\aworld match `\\a` succeed"
i= 2
[1] "hallo\fworld match \f succeed"
[1] "hallo\fworld match `\\f` succeed"
i= 3
[1] "hallo\nworld match \n succeed"
[1] "hallo\nworld match `\\n` succeed"
i= 4
[1] "hallo\tworld match \t succeed"
[1] "hallo\tworld match `\\t` succeed"
i= 5
[1] "hallo\rworld match \r succeed"
[1] "hallo\rworld match `\\r` succeed"
Обратите внимание, что \a
\f
\n
\t
\r
и \\a
\\f
\\n
\\t
\\r
все обрабатывались одинаково в строке регулярного выражения R!
Не только это, вы не можете написать \d
\w
\s
в R регулярном шаблоне выражения!
Вы можете написать любой из них:
pattern="\a" "pattern=\f" "pattern=\n" "pattern=\t" "pattern=\r"
Но вы не можете написать ни одного из них!
pattern="\d" "pattern="\w" "pattern=\s" in grep.
Я думаю, что это тоже ошибка, так как \d
\w
\s
обрабатываются неравномерно с \a
\f
\n
\t
\r
.