正则表达式 - 如何仅替换部分字符串?

时间:2015-11-17 22:51:43

标签: regex

到目前为止,我有这个:

(?<="rec_rec_three": ").*(?=")

适用于

"rec_rec_three": "tini-bikini-martini"

给了我

tini-bikini-martini

但我的目标是用_替换all -'s ...我该如何完成它?

1 个答案:

答案 0 :(得分:0)

如果你的正则表达式支持\ K和\ G,那么使用像

这样的表达式很容易做到这样的替代
's/(\G|"rec_rec_three": ")[^"]*?\K-/_/g

\G表示对前一个匹配结尾的引用,\K将当前匹配的有效开头设置为它发生的位置。 注意(至少在Perl中)这应该是给定字符串变量的第一个匹配操作。否则,\ G可以从前一个继承。 (有关详细信息,请参阅http://www.regular-expressions.info/continue.html

一个简单的测试:

> cat testfile
"rec_rec_three": "tini-bikini-martini"
"rec_rec_one": "tini-bikini-martini" "rec_rec_two": "tini-bikini-martini" "rec_rec_three": "tini-bikini-martini" "rec_rec_four": "tini-bikini-martini"

> cat testfile |   perl -n -e 's/(\G|"rec_rec_three": ")[^"]*?\K-/_/g;print'
"rec_rec_three": "tini_bikini_martini"
"rec_rec_one": "tini-bikini-martini" "rec_rec_two": "tini-bikini-martini" "rec_rec_three": "tini_bikini_martini" "rec_rec_four": "tini-bikini-martini"