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の記号を使用する必要がありました。
置換文字列で\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."
gsub(regex, replacement)
を使用している場合は、_'\1'
_、_'\2'
_、...を使用して一致を参照します。 replacement
を二重引用符で囲まないように注意してください。そうしないと、Joshuaの回答のように円記号をエスケープしてください。 _'\1'
_から一致への変換は、リテラルの解釈ではなく、gsub
内で行われます。gsub(regex){replacement}
を使用している場合は、_$1
_、_$1
_、..を使用します。しかし、あなたの場合、一致を使用しない方が簡単です。
_t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n")
_
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[//]
ラメ(ルボコップ)