1

いくつかの異なる単語で構成された長い文字列があります。

それらすべてを調べたいのですが、単語に特殊文字または数字('-'を除く)が含まれている場合、または大文字で始まる場合は、それを削除します(その文字だけでなく単語全体)。すべての意図と目的のために、「外国の」文字は特殊文字として数えることができます。

明らかな解決策は、各単語をループして(分割した後)、次に各文字をループすることですが、もっと速い方法があるといいのですが?おそらく正規表現を使用していますが、私はほとんど経験がありません。

ありがとう

追加した:

(例えば私が欲しいもの:)

入力:「これは、example.comのような入力の5つの単語の例です」

出力:{this、an、of、words、in、an、input、like-so、from}

(私がこれまでに試したこと)

List<string> response = new List<string>();

string[] splitString = text.Split(' ');

foreach (string s in splitString)
{
    bool add = true;
    foreach (char c in s.ToCharArray())
    {
         if (!(c.Equals('-') || (Char.IsLetter(c) && Char.IsLower(c))))
         {
             add = false;
             break;
         }
         if (add)
         {
             response.Add(s);
         }
    }
}

編集2:

私にとって、単語はスペースで区切られた文字(a..z)の数である必要があります。、/。/!/ ...最後に「特殊文字」条件を考慮しないでください(これは実際にはほとんどの場合、URLなどを削除するためだけのものです)

だから:「私は犬を見ました。それは黒でした!」結果は{saw、a、dog、was、black}になります

4

7 に答える 7

2

したがって、スペースで区切られた単語の場合、文字a-zまたは、のみを含むすべての「単語」を検索しますか?-

このような正規表現は、そのような単語を見つけます。

(?<!\S)[a-z-]+(?!\S)

句読点が1つで終わる単語も許可するには、次を使用できます。

(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))

例(ideone):

var re = @"(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))";
var str = "this, Is an! Example of 5 words in an input like-so from example.com foo: bar?";

var m = Regex.Matches(str, re);

Console.WriteLine("Matched: ");
foreach (Match i in m)
    Console.Write(i + " ");

文字列の句読点に注意してください。

出力:

Matched: 
this an of words in an input like-so from foo bar 
于 2012-05-24T11:54:55.840 に答える
1

これはどう?

(?<= ^ | \ s +)(?[az-] +)(?= $ | \ s +)

編集:意味(?<=^|\s+)(?<word>[a-z\-]+)(?=(?:\.|,|!|\.\.\.)?(?:$|\s+))

ルール:

  1. 単語の前には、行頭またはいくつかの空白文字のみを付けることができます
  2. 単語の後には、行末またはいくつかの空白文字のみを続けることができます(編集は、ピリオド、コンマ、感嘆符、および省略記号で終わる単語をサポートします)
  3. 単語には小文字(ラテン)とダッシュのみを含めることができます

各単語を含む名前付きグループは「word」です

于 2012-05-24T12:01:10.260 に答える
0

Microsoftの「方法:正規表現を使用して文字列を検索する」(C#プログラミングガイド)をご覧ください。これは、C#の正規表現に関するものです。

于 2012-05-24T11:42:33.897 に答える
0
List<string> strings = new List<string>() {"asdf", "sdf-sd", "sdfsdf"};

for (int i = strings.Count-1; i > 0; i--)
{
   if (strings[i].Contains("-"))
   {
       strings.Remove(strings[i]);
   }
}
于 2012-05-24T11:56:35.350 に答える
0

これが出発点になる可能性があります。現在は「。」のみをチェックしています。特別な文字として。これは次のように出力します。

        string pattern = @"[A-Z]\w+|\w*[0-9]+\w*|\w*[\.]+\w*";
        string line = "this Is an Example of 5 words in an in3put like-so from example.com";

        System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(pattern);
        line = r.Replace(line,"");
于 2012-05-24T11:56:40.857 に答える
0

これは、ホワイトリスト方式とブラックリスト方式の2つの方法で実行できます。ホワイトリストを使用すると、許容できると見なす文字のセットを定義し、ブラックリストを使用すると、その反対の文字を定義します。

a-zホワイトリスト方式で、文字A-Zと文字のみを受け入れると仮定しましょう-。さらに、単語の最初の文字を大文字にすることはできないという規則があります。

これを使用すると、次のようなことができます。

string target = "This is a white-list example: (Foo, bar1)";

var matches = Regex.Matches(target, @"(?:\b)(?<Word>[a-z]{1}[a-zA-Z\-]*)(?:\b)");

string[] words = matches.Cast<Match>().Select(m => m.Value).ToArray();

Console.WriteLine(string.Join(", ", words));

出力:

// is, a, white-list, example
于 2012-05-24T11:57:32.337 に答える
0

これを行うには、先読みと後読みを使用できます。これがあなたの例に一致する正規表現です:

(?<=\s|^)[a-z-]+(?=\s|$)

説明は次のとおりです。文字の前にあるものが空白(または文字列の先頭)であり、後に続くものが空白または末尾である限り、1つ以上のアルファベット文字(小文字のみとハイフン)に一致します。文字列。

System.Text.RegularExpressions.Regex.Matches(input, regexString)あなたが今する必要があるのはあなたの単語のリストを得るためにそれを差し込むことです。

参照: http: //www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

于 2012-05-24T12:03:26.100 に答える