29

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 記号を使用するだけで済みました。

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)。を二重引用符で囲んだり、ジョシュアの回答のようにバックスラッシュをエスケープしたりしないでください。からmatch への変換は、文字どおりの解釈ではなく、 内で行われます。'\1''\2'replacement'\1'gsub
  • を使用している場合は、 、、 ...gsub(regex){replacement}を使用します。$1$1

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

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

Ruboco が「Perl スタイルの backref を使用しないでください」と不平を言ったためにここにたどり着いた場合。約 $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[//]

ラメ (ルボコップ)

于 2016-02-09T00:55:09.460 に答える