如何用ruby正则表达式替换部分内容

时间:2016-03-14 01:12:01

标签: ruby regex

我有一个包含此

的字符串
"[quote=\"user.name, post:#{a}, topic:#{b}\"] whatevercontent"

我正在寻找替换帖子和主题的数量,如下所示:

{{1}}

我怎样才能实现这个目标?

2 个答案:

答案 0 :(得分:1)

使用正面的背后隐藏

>> some_string = "[quote=\"user.name, post:1, topic:14\"] some other content here"
=> "[quote=\"user.name, post:1, topic:14\"] some other content here"
>> some_string.sub(/(?<=post:)[^,"]+/, 'aaa').sub(/(?<=topic:)[^,"]+/, 'bbb')
=> "[quote=\"user.name, post:aaa, topic:bbb\"] some other content here"

说明:

/(?<=post:)[^,"]+/

是一串非逗号,非双引号字符,前面是post:。我们使用sub方法将其替换为aaa

然后我们对前面带有topic:的字符执行相同的操作,将该部分替换为bbb

我假设您要替换的部分是冒号和逗号或双引号之间的部分;如有必要,请调整这些字符。

另一种方法是不要担心正则表达式并调用split来分解您对键值对的所有内容,并将所有内容与新值重新组合在一起。但是如果你的用例受到足够的限制,上面的正则表达式方法就可以了。

<强>附录

OP希望确保替换只发生在字符串的括号内,而不是其他任何地方。以下是如何做到的,假设引用部分内没有方括号(因此没有嵌套)

>> s = 'post:no change, [quote="user.name, post:1, topic:14"] topic:no change,'
=> "post:no change, [quote=\"user.name, post:1, topic:14\"] topic:no change,"
>> quote_part = s.scan(/\[quote[^\]]+\]/)[0]
=> "[quote=\"user.name, post:1, topic:14\"]"
>> new_quote_part = quote_part.sub(/(?<=post:)[^,"]+/, 'aaa').sub(/(?<=topic:)[^,"]+/, 'bbb')
=> "[quote=\"user.name, post:aaa, topic:bbb\"]"
>> s.sub(quote_part, new_quote_part)
=> "post:no change, [quote=\"user.name, post:aaa, topic:bbb\"] topic:no change,"

最后一行只有在括号内的引号部分才有替换。

答案 1 :(得分:0)

怎么样:

some_string = "[quote=\"user.name, post:1, topic:14\"] some other content here"
new_post = "2"
new_topic = "15"
some_string = some_string.sub(/post:\d+/, "post:#{new_post}").sub(/topic:\d+/, "topic:#{new_topic}")

puts some_string