Ruby Regex Group Replacement



我正在尝试在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仅在使用dk时起作用。有什么方法可以在我的替换字符串中引用该特定的捕获组?此外,由于我正在为[]使用asterik,因此我知道这种分组可能不止一次。因此,我想产生最后一次匹配。

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

Input:  "e[1mHello theree[34me[40mTexte[0me[0me[22m"
Output: "e[1mHello theree[40mNew Texte[0me[0me[22m"
Input:  "e[1mHello theree[44me[34me[40mTexte[0me[0me[22m"
Output: "e[1mHello theree[40mNew Texte[0me[0me[22m"

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

您可以在替换中使用以下拨号\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演示的输出:

e[1mHello theree[40mNew Texte[0me[0me[22m
e[1mHello theree[40mNew Texte[0me[0me[22m

介意您的输入具有后斜线,需要以常规字符串字面逃脱。要匹配正则态度,我们正在使用双重斜线,因为我们正在寻找字面的后斜线。

最新更新