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)
如果你来到这里是因为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)