JS / Ruby:使用regexp进行部分替换

时间:2010-03-03 13:42:45

标签: javascript ruby-on-rails ruby regex

我正在尝试使用单个正则表达式替换html代码的不同部分。

例如,我有这样的文字:

option_!!NID!! [somme_text][5] some_text_option 5_option_some_text

使用此正则表达式:

content.replace(/(!!NID!!)|\[(\d)\]|(\d)_option/g, 1))

我希望得到:

option_1 [somme_text][1] some_text_option 1_option_some_text

但我有:

option_1 [somme_text]1 some_text_option 1_some_text

有人可以告诉我如何做我想要的,使用一个正则表达式?因为我不明白为什么替换不仅替换括号之间的目标。

谢谢:)

PS:我正在使用Ror,因此也可以使用ruby和JS解决方案。

2 个答案:

答案 0 :(得分:0)

整场比赛被替换。这意味着你需要以不同的方式处理案件:

"option_!!NID!! [somme_text][5] some_text_option 5_option_some_text".
    replace(/!!NID!!/g, "1").
    replace(/\d_option/g, "1_option").
    replace(/\[\d\]/g, "[1]")

然后可以使用第二个案例的前瞻断言来组合第一个和第二个案例:

"option_!!NID!! [somme_text][5] some_text_option 5_option_some_text".
    replace(/!!NID!!|\d(?=_option)/g, "1").
    replace(/\[\d\]/g, "[1]")

答案 1 :(得分:0)

好的,我找到了解决方案。这是一个两步解决方案。

所以,一开始我有:

option_!!NID!! [somme_text][5] some_text_option 5_option_some_text

首先,我使用ruby方法String.gsub:

对我的字符串进行替换

str.gsub!(/\[(\d)\]|(\d_option)/) { |result| result.gsub(/\d/, '!!NID!!') }

在这一步之后,我有:

option_!!NID!! [somme_text][!!NID!!] some_text_option !!NID!!_option_some_text

我现在可以使用JS在客户端执行简单的替换。

content.replace(/(!!NID!!)/g, 1)

瞧瞧:)

我现在已经得到了预期的结果,避免了任何丑陋的JS线。

如果您知道一个,我仍在寻找更好的解决方案:)