当我使用分组时,如何使用gsub对Ruby正则表达式(regex)进行反向引用?
我想修补从网页中提取的一些文本数据。 样品:
t="First sentence. Second sentence.Third sentence."
在第二句末尾的点之后没有空格。 这标志着第3个句子在原始文档中的单独行(在br标记之后)。
我想使用这个正则表达式将“\ n”字符插入适当的位置并修补我的文本。 我的正则表达式:
t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2)
但不幸的是它不起作用:“NoMethodError:未定义的方法`+’为nil:NilClass”如何正确地反向引用匹配的组? 在Microsoft Word中这么简单,我只需要使用\ 1和\ 2符号。
您可以使用\1
对替换字符串进行反向引用(以匹配捕获组1)。
t = "First sentence. Second sentence.Third sentence!Fourth sentence?Fifth sentence." t.gsub(/([.!?])([A-Z1-9])/, "\\1\n\\2") # => "First sentence. Second sentence.\nThird sentence!\nFourth sentence?\nFifth sentence."
- 如果你正在使用
gsub(regex, replacement)
,那么使用'\1'
,'\2'
,…来引用匹配。 确保不要在replacement
加上双引号,否则就像Joshua的回答中那样逃避反斜杠。 从'\1'
到匹配的转换将在gsub
内完成,而不是通过字面解释。 - 如果你正在使用
gsub(regex){replacement}
,那么使用$1
,$1
,…
但对于您的情况,不使用匹配更容易:
t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
如果你来到这里是因为Rubocop抱怨“避免使用Perl风格的背板。” 大约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)