R regexp交换文本部分

时间:2015-07-04 13:16:14

标签: regex r

我想从左到右交换文本部分,反之亦然。这从左到右完美地运作:

sub("(^x+)(.+)", "\\2\\1","xxxxx6.0")
[1] "6.0xxxxx"

而另一方向不:

sub("(.+)(x+$)", "\\2\\1","6.0xxxxx")
[1] "x6.0xxxx"

我错过了什么?

2 个答案:

答案 0 :(得分:4)

问题在于你的第二个正则表达式。第二个正则表达式有一个.+,它是一个匹配每个字符的贪心量词。第一组将尝试尽可能匹配。

(6.0xxxx)(x)

括号表示正则表达式匹配的两个组。

有两种方法可以解决这个问题。第一种是使用惰性量词而不是贪心量词:

/(.+?)(x+$)/

问号使+懒惰,只取最少的数字而不是最多。这会像

那样分组
(6.0)(xxxxx)

这就是你想要的。

另一个选项是匹配非x的所有字符,而不是每个可能的字符。

/(^[^x]+)(+x$)/

匹配组内的插入符号表示匹配组被反转(匹配非x的所有内容)。这将匹配第一个x作为组1的所有内容,这将生成所需的组。

答案 1 :(得分:3)

对于第二个正则表达式,你可以使用负面的lookbehind (?<!...)来解决(.+)贪婪的事实。消极的外观使得(x+$)不会匹配紧跟x之前的字符:

sub("(.+)(?<!x)(x+$)", "\\2\\1", "6.0xxxxx", perl=TRUE)
#[1] "xxxxx6.0"