1

これは二重の質問です。
1. 外字を暗示的に組み込むには?
2. 末尾の空の文字列を取り除くには?

IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");

上記は魅力のように機能しました。それからドイツ人がやって来て、彼らの言葉のいくつかが半分に分かれていると不平を言い始めました. これは、文字列にドットまたはアクセント付きの文字が含まれている場合に発生します。これに取り組む 1 つの方法は、パターンにさらに文字を追加することですが、フランス語、ポーランド語、および基本的英語以外の言語 (ラテン文字のみが有効です) があります。

すべての文字と数字とダッシュをパターン化するより良い方法は何でしょうか?

別の弦で遊んだとき、最後に疑問符があると、最後の分割部分として空の弦が得られることにも気付きました。最後の要素が空の文字列であるかどうかを確認して、今すぐ切り取っています。

なぜ私はそれを取得し、どうすればそれを取り除くことができますか?

4

3 に答える 3

2

正規表現 + Linq はどうですか?

IEnumerable<String> words = Regex.Split(input, @"[^\w0-9-]+")
                                 .Where(s => !String.IsNullOrWhiteSpace(s));

正規表現以外のソリューションも可能です

var words = new string(input.Select(c => char.IsLetterOrDigit(c) || c=='-' ? c : ' ').ToArray())
            .Split()
            .Where(s=>!String.IsNullOrWhiteSpace(s));
于 2013-05-12T17:36:59.450 に答える
1

参照: MSDN: .NET フレーバー regex の正規表現の文字クラス:

  • Word の文字構文は\w(その表の文字クラスはUnicode Character Databaseで定義されています。これは とほぼ同じですが、アンダースコアを除外したい場合a-zA-Z0-9-などに操作が必要になる場合があります。\p{L}0-9-

編集:そして、参考までに、なぜこれがすべてうまくいくのか(そしてa-zA-Zはうまくいかないのか)を説明する記事があります

最後の空の文字列を取り除く方法も尋ねましたか?

String.Split空のエントリを取り除くオプションを提供しますが、そうでRegex.Splitはありません。?分割に使用する単語以外の文字を識別しているため、分割ポイントとして を使用しているため、空のエントリが表示されます。次の 2 つの簡単なオプションがあります。

  • IEnumerable の空のエントリをテストします
  • 正規表現を更新して、単語以外の最後の文字と一致しないようにします

?ただし、2 番目のオプションを実行すると、最後の IEnumerable エントリに最後の文字 (あなたの) が含まれてしまいます。したがって、次のような連続した単語を抽出するために肯定的な一致を使用するようにこれを行う方法を変更したい場合を除き、最初のオプションの方が優れています。

MatchCollection m = new Regex("\\w+").Matches(input);
List<string> words = new List<string>();
foreach (Match item in m)
{
    words.Add(item.Value);
}
于 2013-05-12T17:33:20.340 に答える