这是非常基本的,但我似乎无法找到如何在R中的正则表达式中返回已经匹配的表达式。
例如,假设我想在初始后添加句点,例如将"Joe J Smith"
更改为"Joe J. Smith"
。
我的方法是使用gsub("(?<=\\s|^)[A-Z](?=\\S|$)","\\1.",string,perl=T)
。 (我不是正则表达式的专家,但我认为\\1
或$1
会返回匹配的表达式,即"J"
给出的字符串。
但是,没有,因为这会返回:"Joe . Smith"
我确信这很简单,但我找不到任何试图在R中做类似事情的例子,它有自己的基础正则表达式。
答案 0 :(得分:4)
在这种情况下,您可以使用"\\b"
来引用字词边界:
> gsub("\\b([A-Z])\\b", "\\1.", "Joe J Smith")
[1] "Joe J. Smith"
关于连字符后的字母大写:
> gsub("(-.)", "\\U\\1", "Joe Jones-smith", perl = TRUE)
[1] "Joe Jones-Smith"
答案 1 :(得分:2)
像akrun所说,你需要将大写字母括起来组成一个小组。这就是 The backreference '\N', where 'N = 1 ... 9', matches the substring
previously matched by the Nth parenthesized subexpression of the
regular expression. (This is an extension for extended regular
expressions: POSIX defines them only for basic ones.)
所说的:
R>x
[1] "joe J smith"
R>gsub("(?<=\\s|^)([A-Z])(?=\\s|$)","\\1.",x,perl=TRUE)
[1] "joe J. smith"
添加parens给出了这个例子:
{{1}}