2015-11-17 7 views
0

меня это до сих пор:Regex - Как заменить только часть строки?

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

Который при применении к

"rec_rec_three": "tini-bikini-martini" 

дает мне

tini-bikini-martini 

, но моя цель состоит в том, чтобы заменить все -'s с _-х ... как это сделать?

+2

Мессинга с JSON? :) Каков ваш аромат регулярного выражения? Попробуйте ['(?:" Rec_rec_three ": \ s *" | (?! ^) \ G) \ K ([^ "-] *) -'] (https://regex101.com/r/pN8rU6/1), заменяя '$ 1_'. –

+0

Какую цель? Чтобы заменить символы _value_ '' '' на '_'? – sln

+0

Самый быстрый и простой способ - просто совместить '(" rec_rec_three ": \ s *") ([^ "] +) (? =") 'Использовать группу захвата обратного вызова 1 с нормальной заменой строки' -' с '_' из группы захвата 2. Если у вас есть конструкция' \ K' в вашем движке, вы можете полностью игнорировать группы. '" rec_rec_three ": \ s *" \ K [^ "] + (? =") '. Но используя что-либо с этим сценарием '(? <= ....). * (? = ..)' может вызвать проблемы с обратным трассировкой, если конечный литерал не найден. – sln

ответ

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"