1

たとえば、入力があります:( 2回繰り返されます)そして、インターネット帯域幅"Test your Internet connection bandwidth. Test your Internet connection bandwidth."の文字列を検索したいと思います。

string keyword = tbSearch.Text //That holds value: "internet bandwidth"
string input = "Test your Internet connection bandwidth. Test your Internet connection bandwidth.";

Regex r = new Regex(keyword.Replace(' ', '|'), RegexOptions.IgnoreCase);
if (r.Matches(input).Count == siteKeyword.Split(' ').Length)
{
    //Do something
}

これは機能しません。2つの「インターネット」と2つの「帯域幅」が検出されるため、4とカウントされますが、キーワードの長さは2です。

4

4 に答える 4

4
var pattern = keyword.Split()
        .Aggregate(new StringBuilder(),
                   (sb, s) => sb.AppendFormat(@"(?=.*\b{0}\b)", Regex.Escape(s)),
                   sb => sb.ToString());

if (Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase))
{
    // contains all keywords
}

最初の部分は、キーワードからパターンを生成することです。キーワードが2つある場合"internet bandwidth"、生成される正規表現パターンは次のようになります。

"(?=.*\binternet\b)(?=.*\bbandwidth\b)"

次の入力と一致します。

"Test your Internet connection bandwidth."
"Test your Internet connection bandwidth. Test your Internet bandwidth."

次の入力は一致しません(すべての単語が含まれているわけではありません):

"Test your Internet2 connection bandwidth bandwidth."
"Test your connection bandwidth."

別のオプション(各キーワードを個別に確認する):

var allWordsContained = keyword.Split().All(word => 
    Regex.IsMatch(input, String.Format(@"\b{0}\b", Regex.Escape(word)), RegexOptions.IgnoreCase));
于 2013-01-15T14:43:48.483 に答える
0

何をしようとしているのかわかりませんが、次のようなことを試すことができます。

public bool allWordsContained(string input, string keyword)
{
    bool result = true;
    string[] words = keyword.Split(' ');

    foreach (var word in words)
    {
        if (!input.Contains(word))
            result = false;
    }

    return result;
}

public bool atLeastOneWordContained(string input, string keyword)
{
    bool result = false;
    string[] words = keyword.Split(' ');

    foreach (var word in words)
    {
        if (input.Contains(word))
            result = true;
    }

    return result;
}
于 2013-01-15T14:34:24.353 に答える
0

これが解決策です。手がかりは、結果のリストを取得し、Distinct()を作成することです...

    string keyword = "internet bandwidth";
    string input = "Test your Internet connection bandwidth. Test your Internet connection bandwidth.";

    Regex r = new Regex(keyword.Replace(' ', '|'), RegexOptions.IgnoreCase);
    MatchCollection mc = r.Matches(input);
    List<string> res = new List<string>();

    for (int i = 0; i < mc.Count;i++ )
    {
        res.Add(mc[i].Value);
    }

    if (res.Distinct().Count() == keyword.Split(' ').Length)
    {
        //Do something
    }
于 2013-01-15T14:35:00.860 に答える
0
Regex r = new Regex(keyword.Replace(' ', '|'), RegexOptions.IgnoreCase);
int distinctKeywordsFound = r.Matches(input)
                             .Cast<Match>()
                             .Select(m => m.Value)
                             .Distinct()
                             .Count();
if (distinctKeywordsFound == siteKeyword.Split(' ').Length)
{
    //Do something
}
于 2013-01-15T14:51:39.827 に答える