5

完全な単語ではない単語を削除して文字列を再構築するための、パフォーマンスの面での最良の解決策を探しています。この場合に許容される単語は、数字のない完全な単語、またはスラッシュやバック スラッシュで始まらない単語です。文字のみですが、ハイフンとアポストロフィを含めることができます

例えば:

String str ="\DR1234 this is a word, 123456, frank's place DA123 SW1 :50:/"

上記を使用すると、次を返す新しい文字列が必要になります。

Str = "this is a word, frank's place"

についていくつかの調査を行いましたRegexが、必要なことを行うものは何も見つかりません。

最終的なコード スニペット

var resultSet = Regex.Matches(item.ToLower(), @"(?:^|\s)(?![\\\/])(?!-+(?:\s|$))(?!'+(?:\s|$))(?!(?:[a-z'-]*?-){3,})(?!(?:[a-z'-]*?'){2,})[a-z'-]+[,.]?(?=\s|$)")
                .Cast<Match>()
                .Select(m => m.Value).ToArray();

ご意見をお寄せいただきありがとうございます - これが素晴らしいサイトであることを証明します

4

3 に答える 3

5

説明

あなたのコメントに基づいて:A word in this instance is:

a whole word without numbers 
doesn't start with a forward slash, or a back slash
just letters only
can include hyphen and apostrophes

定義によるすべての単語文字をカバーする文字クラスは で[a-z'-]+あり、そのグループは空白または文字列の開始/終了で囲むことができます。サンプルにはコンマも表示されているので、単語の後にコンマまたはドットが続く可能性があり、そのいずれかに空白が続くことも問題ないと思います。

この正規表現は次のようになります。

  • 単語として定義されたすべてのサブスティングを収集する[a-z'-]+
  • 単語の後にコンマまたはドットを許可しますが、単語の内部または先頭には許可しません
  • すべてのハイフンを含む部分文字列を拒否します
  • すべてのアポストロフィを含む部分文字列を拒否します
  • 単語に 3 つ以上のハイフンが含まれないようにする
  • 単語に 2 つ以上のアポストロフィが含まれないようにする

(?:^|\s)(?![\\\/])(?!-+(?:\s|$))(?!'+(?:\s|$))(?!(?:[a-z'-]*?-){3,})(?!(?:[a-z'-]*?'){2,})[a-z'-]+[,.]?(?=\s|$)

ここに画像の説明を入力

拡大説明

  • (?:^|\s)文字列の先頭または空白に一致します。これにより、「abdc-egfh」のような文字列で問題となる単語境界をテストする必要がなくなります。
  • (?![\\\/])単語が\または/で始まるのを防ぎますが、文字クラスでも許可されていないため、これはオーバーキルです
  • (?!-+(?:\s|$))すべてハイフンである文字列を防ぐ
  • (?!'+(?:\s|$))すべてアポストロフィである文字列を防ぐ
  • (?!(?:[a-z'-]*?-){3,})3 つ以上のハイフンを含む文字列を防ぐ
  • (?!(?:[a-z'-]*?'){2,})2 つ以上のアポストロフィを含む文字列を防ぐ
  • [a-z'-]+[,.]?(?=\s|$)任意の句読点が後に続く単語に一致し、この後にスペースまたは文字列の末尾が続くことを確認します

私は C# プログラマーではありませんが、問題のようなコード ブロックから返された一致の配列は、正規表現を使用して配列/リストを返します。この正規表現はおそらくうまくいくでしょう。この式は、大文字と小文字を区別しないオプションを使用することを想定していることに注意してください。

サンプルテキスト

\DR1234 - this is a word, 123456, frank's place DA123 SW1 :50:/  one-hyphen two-hyphens-here I-have-three-hyphens

マッチ

[0] =>  this
[1] =>  is
[2] =>  a
[3] =>  word,
[4] =>  frank's
[5] =>  place
[6] =>  one-hyphen
[7] =>  two-hyphens-here
于 2013-06-26T04:09:53.780 に答える