我有一个包含此
的字符串"[quote=\"user.name, post:#{a}, topic:#{b}\"] whatevercontent"
我正在寻找替换帖子和主题的数量,如下所示:
{{1}}
我怎样才能实现这个目标?
答案 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