Ruby Regex Group Replacement

时间:2015-05-13 19:02:31

标签: ruby regex pattern-matching gsub

我正在尝试在Ruby中的同一行上执行正则表达式匹配和替换。我有一些库在Ruby中操作字符串并添加特殊的格式字符。格式可以按任何顺序应用。但是,如果我想更改字符串格式,我想保留一些原始格式。我正在使用正则表达式。我正则表达式正确匹配我需要的东西:

mystring.gsub(/[(\e\[([1-9]|[1,2,4,5,6,7,8]{2}m))|(\e\[[3,9][0-8]m)]*Text/, 'New Text')

但是,我真正想要的是与第一个分组匹配:

(\e\[([1-9]|[1,2,4,5,6,7,8]{2}m))

将附加到New Text并替换为New Text。我试图以

的形式引用这场比赛
mystring.gsub(/[(\e\[([1-9]|[1,2,4,5,6,7,8]{2}m))|(\e\[[3,9][0-8]m)]*Text/, '\1' + 'New Text')

但我的理解是\1仅在使用\d\k时才有效。有没有办法在替换字符串中引用该特定捕获组?另外,由于我使用了[]的星号,我知道这种分组可能不止一次。因此,我希望得到最后一个匹配的事件。

我对样本的预期输入/输出是:

Input:  "\e[1mHello there\e[34m\e[40mText\e[0m\e[0m\e[22m"
Output: "\e[1mHello there\e[40mNew Text\e[0m\e[0m\e[22m"

Input:  "\e[1mHello there\e[44m\e[34m\e[40mText\e[0m\e[0m\e[22m"
Output: "\e[1mHello there\e[40mNew Text\e[0m\e[0m\e[22m"

因此找到并附加了最后一个分组。

1 个答案:

答案 0 :(得分:1)

您可以在替换中使用以下正则表达式并使用反向引用\\1

reg = /(\\e\[(?:[0-9]{1,2}|[3,9][0-8])m)+Text/
mystring = "\\e[1mHello there\\e[34m\\e[40mText\\e[0m\\e[0m\\e[22m"
puts mystring.gsub(reg, '\\1New Text')

mystring = "\\e[1mHello there\\e[44m\\e[34m\\e[40mText\\e[0m\\e[0m\\e[22m"
puts mystring.gsub(reg, '\\1New Text')

IDEONE demo的输出:

\e[1mHello there\e[40mNew Text\e[0m\e[0m\e[22m
\e[1mHello there\e[40mNew Text\e[0m\e[0m\e[22m

请注意,您的输入具有需要在常规字符串文字中转义的反斜杠\。为了在正则表达式中匹配它,我们使用双斜杠,因为我们正在寻找文字反斜杠。