正则表达式如何将所有匹配的char移动到字符串的末尾

时间:2013-09-15 06:05:03

标签: regex replace

我想将字符串中所有匹配的字符(在本例中为f,z,x,r和s)移动到它的末尾。

例如:

chafo -> chaof

sasc -> sacs

chafof -> chaoff

我尝试了替代正则表达式:

Pattern: "/(.+)([f|z|x|r|s])+(.*)/"

Replacement: "$1$3$2"

但它只是:chafo -> chaof,而不是chafof -> chaoff

任何人都可以帮助我吗?

更新

还有一件事,有办法改变:truwowfng -> truwowngf

我的意思是,如果rt之后,或者是第二个字符,则不会被移动。

再次感谢!

2 个答案:

答案 0 :(得分:3)

您可能需要一个非准确的量词,例如/(.+?)([fzxrs]+)(.*)/,或指定您不想移动哪些字符:/(.[^fzxrs]*)([fzxrs]+)(.*)/

这会将任何想要的角色的第一次出现(除非是第一次出现)移动到最后。您的代码将最后一个移动到最后。这就是 chafof 失败的原因:它将最后的 f 移动到最后。

答案 1 :(得分:2)

尝试关注正则表达式

s/(.+?)([fzxs]|(?<!t|^.)r)(.*)/$1$3$2/g

简短说明

(.+?)会根据需要使+懒惰

(?<!t|^.)r)将跳过匹配r,其前面是t或者是字符串中的第二个字符。

检查此操作here

<强>输入

chafo
sasc
chafof
truwowfng
arbcd
abcrd

<强>输出

chaof
sacs
chaoff
truwowngf
arbcd
abcdr