Замена строки на регулярное выражение - PullRequest
1 голос
/ 24 января 2012

У меня есть регулярное выражение, которое устанавливает $ 1: оно соответствует тексту между ( и ) в: the_beginning(.*)the_end.

Я хочу заменить значение, соответствующее $ 1, на somethingelse, а не на все регулярные выражения.

В реальном контексте :

my_string содержит:

/* MyKey */ = { [code_missing]; MY_VALUE = "123456789"; [code_missing]; }

Я хочу заменить «123456789» (например, на «987654321»).И это мое регулярное выражение:

"/\\* MyKey \\*/ = {[^}]*MY_VALUE = \"(.*)\";"

1 Ответ

3 голосов
/ 24 января 2012

Я все еще не уверен, что именно вы хотите, но вот код, который должен вам помочь:

str = "Hello this is the_beginning that comes before the_end of the string"
p str.sub /the_beginning(.+?)the_end/, 'new_beginning\1new_end'
#=> "Hello this is new_beginning that comes before new_end of the string"

p str.sub /(the_beginning).+?(the_end)/, '\1new middle\2'
#=> "Hello this is the_beginningnew middlethe_end of the string"

Edit:

theDoc = '/* MyKey */ = { [code_missing]; MY_VALUE = "123456789";'
regex  = %r{/\* MyKey \*/ = {[^}]*MY_VALUE = "(.*)";}
p theDoc[ regex, 1 ]   # extract the captured group
#=> "123456789"

newDoc = theDoc.sub( regex, 'var foo = \1' )
#=> "var foo = 123456789"  # replace, saving the captured information

Редактирование # 2: Получение доступа к информации до / после матча

regex = /\d+/
match = regex.match( theDoc )
p match.pre_match, match[0], match.post_match
#=> "/* MyKey */ = { [code_missing]; MY_VALUE = \""
#=> "123456789"
#=> "\";"

newDoc = "#{match.pre_match}HELLO#{match.post_match}"
#=> "/* MyKey */ = { [code_missing]; MY_VALUE = \"HELLO\";"

Обратите внимание, что для этого требуется регулярное выражение, которое на самом деле не соответствует тексту до и после публикации.

Если вам нужно указать ограничения, а не содержимое, вы можете использовать lookbehind / lookahead нулевой ширины:

regex = /(?<=the_beginning).+?(?=the_end)/
m = regex.match(str)
"#{m.pre_match}--new middle--#{m.post_match}"
#=> "Hello this is the_beginning--new middle--the_end of the string"

… но теперь это явно больше, чем просто захват и использование \1 и \2. Я не уверен, что полностью понимаю, что вы ищете, почему вы думаете, что будет проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...