2017-06-03 282 views
0

是否可以记下正则表达式,以便第一个$符号将被替换为(第二个替换为a),第三个替换为()等?如何用偶数位置(和奇数位置)替换字符

例如,串

This is an $example$ of what I want, $ 1+1=2 $ and $ 2+2=4$. 

应该成为

This is an (example) of what I want, (1+1=2) and (2+2=4). 
+0

编号正则表达式用于查找模式(带有全局标志的一个或多个),而不是一个字符的第n个出现。你将不得不指定周围在这里应用一个有用的正则表达式(例如,直接在数字之前/之后的每个“$”)。您最好使用索引函数来查找某个字符所在的所有索引。 –

+0

请添加语言标签。 – 2017-06-03 17:34:45

回答

0

排序的间接解决办法,但在某些语言中,你可以使用callback function为repla水泥。然后,您可以循环执行该功能中的选项。这也可以用于两个以上的选项。例如,在Python:

>>> text = "This is an $example$ of what I want, $ 1+1=2 $ and $ 2+2=4$." 
>>> options = itertools.cycle(["(", ")"]) 
>>> re.sub(r"\$", lambda m: next(options), text) 
'This is an (example) of what I want, (1+1=2) and (2+2=4).' 

或者,如果这些总是成对出现的,因为它似乎是在你的榜样的情况下,你可以匹配之间既$和一切,然后更换$和重用之间的东西使用组参考\1;但同样,并非所有的语言都支持那些:

>>> re.sub(r"\$(.*?)\$", r"(\1)", text) 
'This is an (example) of what I want, (1+1=2) and (2+2=4).' 
0

在R,你可以使用str_replace函数,它只是取代了第一场比赛,和一个while循环来处理在同一时间对比赛的。

# For str_* 
library(stringr) 
# For the pipes 
library(magrittr) 

str <- "asdfasdf $asdfa$ asdfasdf $asdf$ adsfasdf$asdf$" 

while(any(str_detect(str, "\\$"))) { 
    str <- str %>% 
    str_replace("\\$", "(") %>% 
    str_replace("\\$", ")") 
} 

这不是最有效的解决方案,可能的,但它会经过,并贯穿整个字符串(和)代替$。

+0

这是什么语言?我假设这里的'str_replace'只会替换它找到的第一个实例?您可能想要添加该信息。 –

+0

对不起,认为这被标记为R.更新。 –

0

在JavaScript:

function replace$(str) { 
    let first = false; 
    return str.replace(/\$/, _ => (first = !first) ? '(' : ')'); 
} 
相关问题