29

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

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

第二句末尾的点后面没有空格。这表明第 3 句在原始文档中位于单独的行中(在 br 标记之后)。

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

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

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

4

3 回答 3

33

您可以在替换字符串中反向引用\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."
于 2012-08-22T02:51:12.413 回答
25
  • 如果您使用gsub(regex, replacement), 则使用'\1', '\2', ... 来指代匹配。确保不要在 周围加上双引号replacement,或者像 Joshua 的回答那样转义反斜杠。从'\1'到匹配的转换将在 内完成gsub,而不是通过字面解释。
  • 如果您正在使用gsub(regex){replacement}, 则使用$1, $1, ...

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

t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
于 2012-08-22T03:23:29.263 回答
8

如果你是因为 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[//]

跛脚(Rubocop)

于 2016-02-09T00:55:09.460 回答