提问人:Konstantin 提问时间:8/22/2012 更新时间:2/9/2016 访问量:19606
当我使用分组时,如何使用 gsub 在 Ruby 正则表达式(regex)中反向引用?
How to backreference in Ruby regular expression (regex) with gsub when I use grouping?
问:
我想修补一些从网页中提取的文本数据。 样本:
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 符号。
答:
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)
评论
$1
$2
gsub
'\1'
$1