web-dev-qa-db-ja.com

グループ化を使用するときにgsubでRuby正規表現(regex)を逆参照する方法は?

Webページから抽出したテキストデータにパッチを当てたいと思います。サンプル:

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

2番目の文の終わりのポイントの後にスペースはありません。これは、3番目の文が元のドキュメントの別の行(brタグの後)にあったことを示しています。

この正規表現を使用して、「\ n」文字を適切な場所に挿入し、テキストにパッチを適用したいと思います。私の正規表現:

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

しかし、残念ながらそれは機能しません: "NoMethodError:undefined method` + 'for nil:NilClass"どうすれば、一致したグループを適切に逆参照できますか? Microsoft Wordではとても簡単だったので、\ 1と\ 2の記号を使用する必要がありました。

25
Konstantin

置換文字列で\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."
32
Joshua Cheek
  • gsub(regex, replacement)を使用している場合は、_'\1'_、_'\2'_、...を使用して一致を参照します。 replacementを二重引用符で囲まないように注意してください。そうしないと、Joshuaの回答のように円記号をエスケープしてください。 _'\1'_から一致への変換は、リテラルの解釈ではなく、gsub内で行われます。
  • gsub(regex){replacement}を使用している場合は、_$1_、_$1_、..を使用します。

しかし、あなたの場合、一致を使用しない方が簡単です。

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

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[//]

ラメ(ルボコップ)

7
Ben Wiseley