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

How to backreference in Ruby regular expression (regex) with gsub when I use grouping?

提问人:Konstantin 提问时间:8/22/2012 更新时间:2/9/2016 访问量:19606

问:

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

t="First sentence. Second sentence.Third sentence."

第二句末尾的要点后没有空格。这标志着第三句话在原始文档中的单独行(在 br 标签之后)。

我想使用此正则表达式将“\n”字符插入到正确的位置并修补我的文本。 我的正则表达式:

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

但不幸的是,它不起作用:“NoMethodError:undefined method '+' for nil:NilClass” 如何正确地回溯到匹配的组? 在 Microsoft Word 中非常简单,我只需要使用 \1 和 \2 符号。

Ruby 正则表达式 GSUB 反向引用

评论

2赞 mu is too short 8/22/2012
编号的全局变量 (, , ...) 不是在计算第二个参数时设置的,而是在它屈服于块之前设置的。因此,sawa 关于何时使用和何时使用的建议。$1$2gsub'\1'$1

答:

34赞 Joshua Cheek 8/22/2012 #1

您可以在替换字符串中使用 (以匹配捕获组 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."
26赞 sawa 8/22/2012 #2
  • 如果您使用的是 ,则使用 、 、 ...来引用比赛。确保不要在 两边加上双引号,否则会像约书亚的回答那样转义反斜杠。从匹配到匹配的转换将在 内完成,而不是通过字面解释。gsub(regex, replacement)'\1''\2'replacement'\1'gsub
  • 如果您使用的是 ,则使用 、 、 ...gsub(regex){replacement}$1$1

但就您的情况而言,不使用火柴更容易:

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

评论

1赞 mu is too short 8/22/2012
他必须使用双引号来获取换行符或 .'\1' + "\n" + '\2'
0赞 sawa 8/22/2012
@muistooshort OP 最初使用的是 ,所以你给出的就是我的想法。+
8赞 Ben Wiseley 2/9/2016 #3

如果你因为 Rubocop 抱怨“避免使用 Perl 风格的 backrefs”而来到这里,大约 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[//]

跛脚 (Rubocop)