我有一个设置$ 1的正则表达式:它对应于(
中)
和the_beginning(.*)the_end
之间的文字。
我想用somethingelse
替换$ 1对应的值,而不是所有正则表达式。
在实际环境中:
my_string包含:
/* MyKey */ = { [code_missing]; MY_VALUE = "123456789"; [code_missing]; }
我想替换“123456789”(例如“987654321”)。 这是我的正则表达式:
"/\\* MyKey \\*/ = {[^}]*MY_VALUE = \"(.*)\";"
答案 0 :(得分: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\";"
请注意,这需要一个实际上与前/后文本不匹配的正则表达式。
如果您需要指定限制而不是内容,可以使用零宽度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
。我不确定我完全理解你在寻找什么,为什么你认为它会更容易。