I'm learning R's regular expression and I am having trouble understanding this
Part
example:
gsub
So far I think I get:
gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", x)
or .
or |
or (
or {
or }
or +
or $
it adds ?
in front of itI can't explain:
\\
or
> gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", '10\1')
[1] "10\001"
I am also confused why the replacement > gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", '10/1')
[1] "10/1"
add only two brackets.
I'm suppose to figure out what this function does and I think it's suppose to escape certain special characters ?
答案 0 :(得分:6)
整个模式包含在括号中,允许反向引用。这部分:
.foo-template h1 {...}
...是一个“字符类”,所以它匹配方括号内的任何一个字符,正如你所说,它正在改变模式语法将解释模式中的元字符的方式定义。
下一部分是一个“管道”字符,它是正则表达式后跟一个转义的开放式方括号,另一个是“OR”管道,然后是一个转义的紧密方括号。由于R和正则表达式都使用反斜杠作为转义,因此您需要将它们加倍以在模式中获得R +正则表达式转义...但在替换字符串中不。如果将close-square-bracket首先放在字符串中,则只能在字符类中输入,并且整个模式可以更紧凑地形成:
[.|()\\^{}+$*?]
在替换字符串中,形式 "[][.|()\\^{}+$*?]" # without the "|\\[|\\])"
指的是与“模式”的第n个括号部分匹配的任何内容,在这种情况下,“\ 1”是替换的第二部分。第一个位置是“\”,它形成一个转义,第二个“\”形成反斜杠。现在准备迎接更奇怪的部分...结果中有多少个字符?
"\\n"
当然,比赛中的所有项目都不等于'\ 1'。有人在你面前编写任何教程(我认为不是> nchar( gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\1", '10\1') )
[1] 3
帮助页面)有一种奇怪的感觉幽默。如果您需要创建系统gsub
函数拦截的字符,这里有一些函数可能很有用:
readline
请查看> intToUtf8(1)
[1] "\001"
> ?intToUtf8
> 0x0
[1] 0
> intToUtf8(0)
[1] ""
> utf8ToInt("")
integer(0)
,其中可以找到许多有用的信息(在我认为不太可能的标题下),关于R如何处理八进制,十六进制和其他数字以及特殊字符。
答案 1 :(得分:4)
第一个正则表达式是这个
( # (1 start)
[.|()\^{}+$*?]
| \[
| \]
) # (1 end)
它捕获'class'或'['或']'中的任何内容然后看起来它用\\\1
取代它,这是一个逃脱加上捕获1中的任何东西。
所以,基本上它只是逃脱了其中一个字符的一次出现。
正则表达式可以更好地写为([.|()^{}\[\]+$*?])
或者在一个中
字符串为"([.|()^{}\\[\\]+$*?])"
编辑(推广评论) -
正则表达式不匹配字符串10 \ 1所以应该没有替换。打印输出必须有插值(语言)。看起来它将它转换为八进制\ 001。 - 由于它不能显示二进制1,它显示其八进制等效值。