1

Ruby、Regex、Stackoverflowは初めてです。xDこれが私の問題です:

正規表現を使用して、ベトナム語のテキストで他の単語とは別に、標準のASCII文字を含む連続した単語で構成されるフレーズを抽出したいと思います。

別の言い方をすれば、 \ w文字のみのフレーズ。例:

MìnhrấtthíchconSharpnày(mặcdùchưaxàibaohnhưngchỉnghecácpácnóimìnhđãthấyphêlòimắ​​trồi)。Cácbạnchomìnhhỏi1câu(cácbạnđừngchêmìnhngunhétộinghiệpmình):cáimáynàyđemsangAnhdùngmạng NếudùngđượcbênAnhmàkhôngphảichọcngoáyjthìmìnhmuamộtcái

その意味は気にしないでください。私が達成したいのは、2つのペアの結果を含むハッシュの配列です。value =>抽出されたフレーズの値、starting_position=>最初の文字の位置

についての例によると、次のようになります。[{:value => "con Sharp"、:starting_position => 16}、{:value => "bao h"、:starting_position => blah blah} .. .. ]

これは、「mình」、「rất」、「thích」などの\W文字を含むすべての単語が拒否されることを意味します。

Ruby 1.9.2のrubular.comでこの正規表現を使用して上記の例を試してみてください:

\ b [\ w | \ s] + \ b

ほぼ希望のフレーズ(スペースのみのフレーズを除く)を取得しましたが、Win764ビットを使用している1.9.2p290でもあるRubyでは機能しないようです。

任意のアイデアをいただければ幸いです。よろしくお願いします。

4

1 に答える 1

1

rubularによると、\w すべてのASCII文字と数字(および下線付き)に一致するように見えますが\b、すべてのUnicode文字でうまく機能しています。それは少し紛らわしいです。

ただし、必要なのはすべてASCII単語のシーケンスです。これはそれらと一致する必要があります:

/\b[a-z]+\b(?:\s+[a-z]+)*\b/i

実例:http ://www.rubular.com/r/1iewl7MpJe

簡単な説明:

  • \b[a-z]+\b-最初のASCIIワード。
  • (?:\s+[a-z]+)-任意の数のスペースと単語-毎回少なくとも1つのスペースと1つの文字。
  • \b-のように、最後の単語が別の単語の途中で終わらないようnにするため"con Sharp này"

ハッシュを取得するかどうかはわかりませんが、MatchData次のようにすべてを取得
できます。文字列内で出現するすべてのRuby正規表現の一致データを取得するにはどうすればよいですか。

s = "hello !@# world how a9e you"
r = /\b[a-z]+\b(?:\s+[a-z]+)*\b/i

matches = s.to_enum(:scan, r).map { Regexp.last_match }
           .map {|match| [match.to_s(), match.begin(0)]}
puts matches 

これがideoneの例です:http://ideone.com/YRZE5

于 2012-03-30T12:17:53.063 に答える