当我使用分组时,如何使用gsub在Ruby正则表达式(regex)中进行反向引用?
我想修补一些从网页中提取的文本数据。 样本: 第二句末尾的点后面没有空格。这表明第三句话在原始文档的单独一行中(在br标记之后) 我想使用此regexp将“\n”字符插入正确的位置并修补我的文本。 我的正则表达式:当我使用分组时,如何使用gsub在Ruby正则表达式(regex)中进行反向引用?,ruby,regex,reference,gsub,backreference,Ruby,Regex,Reference,Gsub,Backreference,我想修补一些从网页中提取的文本数据。 样本: 第二句末尾的点后面没有空格。这表明第三句话在原始文档的单独一行中(在br标记之后) 我想使用此regexp将“\n”字符插入正确的位置并修补我的文本。 我的正则表达式: t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2) 但不幸的是,它不起作用:“NoMethodError:nil:NilClass的未定义方法”+” 如何正确地反向引用匹配的组? 在Microsoft Word中非常简单,我只需使用\1和\2符号。
t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2)
但不幸的是,它不起作用:“NoMethodError:nil:NilClass的未定义方法”+”
如何正确地反向引用匹配的组?
在Microsoft Word中非常简单,我只需使用\1和\2符号。您可以使用
\1
在替换字符串中反向引用(以匹配捕获组1)
- 如果使用的是
,则使用gsub(regex,replacement)
,'\1'
。。。指的是比赛。确保不要在替换的'\2'
前后加上双引号,或者像约书亚的回答那样避开反斜杠。从
到匹配的转换将在'\1'
中完成,而不是通过文字解释gsub
- 如果您使用的是
,则使用gsub(regex){replacement}
,$1
$1
t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
t2=t.gsub(/(?如果您是因为Rubocop抱怨“避免使用Perl风格的backref.”而来到这里的,大约$1、$2等。您可以这样做:
some_id = $1
# or
some_id = Regexp.last_match[1] if Regexp.last_match
some_id = $5
# or
some_id = Regexp.last_match[5] if Regexp.last_match
它也会希望你这样做
%r{//}.match(some_string)
而不是
some_string[//]
Lame(Rubocop)他将不得不使用双引号来获得换行符或'\1'+“\n”+'\2'
@muistooshort该OP最初使用的是+
,所以你给出的是我的想法。编号的全局($1
,$2
,…)在第二个参数求值时未设置它们,它们由gsub
在它屈服于块之前设置。因此,sawa建议何时使用'\1'
以及何时使用$1
。
%r{//}.match(some_string)
some_string[//]