匹配整个字符串

时间:2013-12-07 06:55:20

标签: c# regex string

这是我需要完成的一个例子,作为更大程序的一部分。该示例包含两个listView。 listViewInput包含三个文本项:“banana”,“banana tree”和“banana peel”。

我需要遍历listView项目并找到字符串textToCompare中包含完全的项目。 textToCompare将在我正在寻找的实际字符串的一侧或两侧始终有额外的文本(不会是==的东西)。

此比较的问题是If语句将为listView项“banana”以及“banana tree”返回true。这看起来很简单,但我已经尝试了所有我能想到的并且没有运气的东西。任何帮助将不胜感激。

string textToCompare = "word banana tree more words";

for (int i = 0; i < listViewInput.Items.Count; i++)
{
    if (Regex.IsMatch(textToCompare, listViewInput.Items[i].Text))
    {
         listViewOutput.Items.Add(listViewInput.Items[i].Text);
    }
}

2 个答案:

答案 0 :(得分:2)

好的,这是你修改后的答案,返回最大的匹配:

// This is the equivalent to your `listViewInput.Item`
string[] words = new string[] { "banana", "banana tree" , "banana peel"};

string textToCompare = "word banana tree more words";

string longest_match = 
    (from word in words.OrderByDescending(w => w.Length)
     where textToCompare.Contains(word)
     select word).FirstOrDefault();

这将以longest_match持有“香蕉树”结束。

不确定为什么需要正则表达式...使用包含,并将我的单词数组更改为您的商品来源。

答案 1 :(得分:0)

我不做c#但是在算法上你需要两次通过。第二遍虽然会降低成本的对数。

我认为你必须:

  1. 按条目长度排序listViewInput
  2. 然后再次循环列表,与textToCompare进行比较。您可以使用正则表达式,但请确保它使用单词边界。
  3. 每次点击匹配时,都会从TextToCompare中删除该项以进行下一次迭代。 e..g删除“香蕉树”。稍后在排序列表中的某个地方“banana”将无法匹配
  4. #2>#2:您的输入项保持不变,但正则表达式将成为动态部分。就像我说我不做c#所以请编辑语法某人,尤其是IsMatch方法:

    string textToCompare = "word banana tree more words";
    
    for (int i = 0; i < listViewInput.Items.Count; i++)
    {
        string regex = `\b'+listViewInput.Items[i].Text[i]+'\b`  // e.g. `\bbanana\b`
        if (Regex.IsMatch(textToCompare,regex ))
        {
            listViewOutput.Items.Add(listViewInput.Items[i].Text);
        }
    }