当我使用分组时,如何使用gsub对Ruby正则表达式(regex)进行反向引用?

Kon*_*tin 23 ruby regex backreference reference gsub

我想修补从网页中提取的一些文本数据.样品:

t="First sentence. Second sentence.Third sentence."
Run Code Online (Sandbox Code Playgroud)

在第二句末尾的点之后没有空格.这标志着第3个句子在原始文档中的单独行(在br标记之后).

我想使用这个正则表达式将"\n"字符插入适当的位置并修补我的文本.我的正则表达式:

t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2)
Run Code Online (Sandbox Code Playgroud)

不过遗憾的是它不工作:"NoMethodError:未定义的方法`+"的零:NilClass"我怎样才能正确地反向引用匹配的群体?在Microsoft Word中这么简单,我只需要使用\ 1和\ 2符号.

Jos*_*eek 30

您可以使用\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."
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 21

  • 如果您正在使用gsub(regex, replacement),然后用'\1','\2',...来引用匹配.确保不要在其周围加上双引号replacement,否则就像Joshua的回答中那样逃避反斜杠.转换'\1'到匹配将在内部完成gsub,而不是通过字面解释.
  • 如果您正在使用gsub(regex){replacement},然后用$1,$1,...

但对于您的情况,不使用匹配更容易:

t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
Run Code Online (Sandbox Code Playgroud)


Ben*_*ley 7

如果你来到这里是因为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
Run Code Online (Sandbox Code Playgroud)

它也希望你这样做

%r{//}.match(some_string)
Run Code Online (Sandbox Code Playgroud)

代替

some_string[//]
Run Code Online (Sandbox Code Playgroud)

Lame(Rubocop)