6

私はいくつかの文字列を持っています:

"rose with ribbon"
"roses in concrete"
"roses on bed"

好みの単語が存在する文字列を見つけるためのプログラムを作成する必要があります

例:「on」がどこにあるかという文字列を見つけるので、「ベッドの上のバラ」だけを取得する必要があります。

私はこのコードを使用しました:

foreach (KeyWord key in cKeyWords)
{
    foreach (string word in userWords)
    {
        if (key.keyWord.IndexOf(word) != -1)
        {
            ckeyList.Add(key);
        }
    }
}

しかし、IndexOfがすべての文字列で「オン」を検出するため、すべての文字列を取得します。

分割せずに文字列内の別の単語を見つける他の解決策はありますか?たぶん、LinqまたはRegexを使用することは可能ですか?しかし、私はそれらを使うのが苦手なので、例があればいいのにと思います。

4

5 に答える 5

6

で正規表現を使用すると、\bon\bそれを行う必要があります。

\bは単語境界の正規表現アンカーであるため、正規表現は単語境界の直後に一致し、on直後に別の単語境界が続きます。

次のC#の例...

string [] sArray = new string []
    {{
        「リボンでバラ」、
        「ベッドの上のバラ」、
        「具体的なバラ」
    };

正規表現re=new Regex( "\\ bon \\ b");
foreach(sArrayの文字列s)
{{
    Console.Out.WriteLine( "{0} match?{1}"、s、re.IsMatch(s));

    一致m=re.Match(s);
    foreach(m.Groupsのグループg)
    {{
        if(g.Success)
        {{
            Console.Out.WriteLine( "一致が位置{0}"、g.Indexで見つかりました);
        }
    }
}

...次の出力が生成されます。

リボンマッチでバラ?誤り
ベッドの上のバラの試合?真
    位置6で一致が見つかりました
具体的なマッチのバラ?誤り
于 2012-09-15T17:45:34.793 に答える
1

はい、正規表現を使用すると、文字列内の単語を見つけることができます。で試してみてください

string regexPattern;

foreach (KeyWord key in cKeyWords)
{
  foreach (string word in userWords)
  {
    regexPattern = string.Format(@"\b{0}\b", System.Text.RegularExpressions.Regex.Escape(word));
    if (System.Text.RegularExpressions.Regex.IsMatch(key.keyWord, regexPattern))
    {
        ckeyList.Add(key);
    }
  }
}

大文字と小文字を区別して検討したくない場合は、文字列に対してToLower()メソッドを使用します。

 foreach (KeyWord key in cKeyWords)
{
  foreach (string word in userWords)
  {
    regexPattern = string.Format(@"\b{0}\b", System.Text.RegularExpressions.Regex.Escape(word.ToLower()));
    if (System.Text.RegularExpressions.Regex.IsMatch(key.keyWord.ToLower(), regexPattern))
    {
        ckeyList.Add(key);
    }
  }
}
于 2012-09-16T07:47:07.693 に答える
0

正規表現を使用して、この記事を読んでください:http: //www.dotnetperls.com/regex-match

そして、ここに正規表現を研究するための別の良い記事があります:http: //www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

于 2012-09-15T17:43:13.903 に答える
0

問題は、すべての文字列(*のribb * 、 *creteのc* )にある「 on」を検索していることです。

「on」を検索する必要があります。

より良い解決策は、文字列を単語の配列に解析し、それらを反復処理することです。

于 2012-09-15T17:45:26.557 に答える
0

一言で言えば、これはあなたができることです(適切なC#文字列クラスを置き換える)StartsWithEndsWith

foreach (KeyWord key in cKeyWords)
{
   foreach (string word in userWords)
   {
       if (key.keyWord.IndexOf(" " + word + " ") != -1
          || key.keyWord.StartsWith(word + " ") 
          || key.keyWord.EndsWith(" " + word))
       {
           ckeyList.Add(key);
       }
}
于 2012-09-15T17:47:57.010 に答える