2012-01-23 329 views
1

我有一個正則表達式設置$ 1:它對應於()之間的文本:the_beginning(.*)the_end字符串替換正則表達式

我想用somethingelse替換對應於$ 1的值,而不是所有的正則表達式。

在真實的語境

my_string包含:

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

我要替換 「123456789」(與 「987654321」 的例子)。 這是我的正則表達式:

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

+1

你可以發佈你的代碼嗎? –

回答

3

我還是不知道你想要什麼,但這裏的一些代碼,應該可以幫助您:

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" 

編輯:

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\";" 

注意,這需要一個正則表達式實際上不匹配的前/後的文本之後。

如果你需要指定範圍,而不是內容,可以使用零寬度回顧後/前瞻:

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清楚更多的工作。我不確定我完全理解你在找什麼,爲什麼你認爲它會更容易。

+0

沒錯,但有沒有一個更清晰的版本,允許直接版本,而不是複製左側和右側的部分? – louiscoquio

+0

我只想替換「123456789」,就像你用'p str.sub /(the_beginning).+?(the_end)/','1 new middle \ 2''所做的那樣。我只是想,有一個更好的解決方案來做到這一點 – louiscoquio

+0

@louiscoquio啊,讓我爲你做一個編輯。 – Phrogz