Regular expression in R: gsub pattern

时间:2015-05-12 23:34:45

标签: regex r

I'm learning R's regular expression and I am having trouble understanding this Part example:

gsub

So far I think I get:

  • if x is alphanumeric it doesn't match so all nothing modified
  • if x contains a gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", x) or . or | or ( or { or } or + or $ it adds ? in front of it

I 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 ?

2 个答案:

答案 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,它显示其八进制等效值。