R regexp交换文本部分

R regexp交换文本部分,regex,r,Regex,R,我想从左到右交换文本部分,反之亦然。这是从左到右完美的工作: sub("(^x+)(.+)", "\\2\\1","xxxxx6.0") [1] "6.0xxxxx" 而另一个方向没有: sub("(.+)(x+$)", "\\2\\1","6.0xxxxx") [1] "x6.0xxxx" 我遗漏了什么?问题在于你的第二个正则表达式。第二个正则表达式有一个+,它是一个贪婪的量词,匹配每个字符。第一组将尽可能地匹配 (6.0xxxx)(x) 括号表示将由正则表达式匹配的两个组 有两种方法可

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

sub("(^x+)(.+)", "\\2\\1","xxxxx6.0")
[1] "6.0xxxxx"
而另一个方向没有:

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

我遗漏了什么?

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

(6.0xxxx)(x)
括号表示将由正则表达式匹配的两个组

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

/(.+?)(x+$)/
问号使
+
变懒,只取尽可能少的位数,而不是最多的位数。这群人想要什么

(6.0)(xxxxx)
这就是你想要的

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

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

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

您可以使用负lookback
(?)让第二个正则表达式绕过
(.+)
是贪婪的这一事实。负lookback使得
(x+$)
与前面紧跟着
x的字符不匹配:

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

sub((.+)(?谢谢你的回答,工作得很好,比Strikeskids复杂一点)。一票……工作得很好!谢谢你的解释!或者你可以拆分字符串并将其反转
rev(strsplit(“xxxxx 6.0”)(?