15

同様の質問をいくつか見ましたが、これを達成しようとしています。

文字列を指定すると、str="月は私たちの自然の衛星です。つまり、月は地球の周りを回転しています!" 単語を抽出して配列に格納したい。予想される配列要素はこれです。

the 
moon 
is 
our 
natural 
satellite 
i.e. 
it  
rotates 
around 
the 
earth

String.split( ','\t','\r') を使用してみましたが、これは正しく機能しません。. やその他の句読点も削除しようとしましたが、「ie」のような文字列も解析したいと思います。これを達成するための最良の方法は何ですか?また、regex.split を使用してみましたが、役に立ちませんでした。

string[] words = Regex.Split(line, @"\W+");

正しい方向へのいくつかの微調整に感謝します。

4

4 に答える 4

38

正規表現ソリューション。

(\b[^\s]+\b)

そして、本当に.最後に修正したい場合i.e.は、これを使用できます。

((\b[^\s]+\b)((?<=\.\w).)?)

これが私が使用しているコードです。

  var input = "The moon is our natural satellite, i.e. it rotates around the Earth!";
  var matches = Regex.Matches(input, @"((\b[^\s]+\b)((?<=\.\w).)?)");

  foreach(var match in matches)
  {
     Console.WriteLine(match);
  }

結果:

The
moon
is
our
natural
satellite
i.e.
it
rotates
around
the
Earth
于 2011-09-05T18:55:35.053 に答える
8

あなたが探している解決策は、あなたが思っているよりもはるかに複雑だと思います。ピリオドが単語の一部であるか文の終わりであるかを判断できるように、何らかの形の実際の言語分析、または少なくとも辞書を探しています。両方を行う可能性があるという事実を考慮しましたか?

許可されている「句読点を含む単語」の辞書を追加することを検討してください。これは、問題を解決する最も簡単な方法かもしれません。

于 2011-09-05T18:57:09.343 に答える
1
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value)
于 2011-09-05T19:06:31.227 に答える
1

これは私にとってはうまくいきます。

var str="The moon is our natural satellite, i.e. it rotates around the Earth!";
var a = str.Split(new char[] {' ', '\t'});
for (int i=0; i < a.Length; i++)
{
    Console.WriteLine(" -{0}", a[i]);
}

結果:

 -The
 -moon
 -is
 -our
 -natural
 -satellite,
 -i.e.
 -it
 -rotates
 -around
 -the
 -Earth!

コンマやセミコロンなどを削除して、結果の後処理を行うことができます。

于 2011-09-05T18:53:01.050 に答える