【问题标题】:C#: finding instances of a string within a stringC#:在字符串中查找字符串的实例
【发布时间】:2010-10-25 05:00:48
【问题描述】:

假设我有字符串“1 AND 2 AND 3 OR 4”,并且想要创建一个字符串数组,其中包含在字符串中依次找到的所有子字符串“AND”或“OR”。

所以上面的字符串会返回一个 {"AND", "AND", "OR"} 的字符串数组。

什么是聪明的写作方式?

编辑: 使用 C# 2.0+,

string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
string[] conditions = Regex.Split(rule, pattern);

给我 {"1", "AND", "2", "AND", "3", "OR", "4"},这不是我想要的。我怎样才能将其简化为 AND 和 OR?

【问题讨论】:

  • 我可以看到你想要做什么,但我不认为Split 方法最适合你想要的。请参阅拆分正在分隔 AND 和 OR 处的输入,从而产生数字(并且只有括号的 AND/ORs coz) - 这不是您想要的。您需要 AND 和 OR。我认为精心设计的正则表达式模式可以返回多个匹配项,因此仅捕获 AND 和 OR。
  • 如果这个要求你能解释一下目的吗?它可能有助于设计更合适的正则表达式。

标签: c# string matching


【解决方案1】:

这个正则表达式 (.NET) 似乎可以满足您的需求。您正在 index=1 的组中查找匹配项(多个):

.*?((AND)|(OR))*.*?

编辑我已经测试了以下内容,它似乎可以满足您的需求。它比我想要的要多,但它以纯粹的正则表达式方式处理任务(恕我直言,你应该这样做):

        string text = "1 AND 2 AND 3 OR 4";
        string pattern = @"AND|OR";

        Regex r = new Regex(pattern, RegexOptions.IgnoreCase);

        Match m = r.Match(text);
        ArrayList results = new ArrayList();
        while (m.Success)
        {
            results.Add(m.Groups[0].Value);

            m = m.NextMatch();
        }

        string[] matchesStringArray = (string[])results.ToArray(typeof(string));

【讨论】:

  • 耸耸肩也许我把它复杂化了。
  • 在 C# 2.0+ 中,使用“AND|OR”作为模式给我的不仅仅是 AND 和 OR - 我怎样才能限制模式只给我 AND 和 OR?我已经编辑了上面的问题。
  • 似乎让正则表达式引擎进入下一个匹配项(“AND|OR”)的唯一方法是调用 .NextMatch() 方法。这个 sux 因为现在你必须迭代。但似乎你永远不会使用某种循环来逃脱。希望这没问题。
  • 您可以使用 Regex.Matches 在一次调用中获取所有结果...但正如您所说,您必须迭代结果集合...或使用 Linq 来获得您想要的结果想要!
  • 你说的很酷,因为我也在考虑使用 LINQ 过滤掉脏集合的部分。我只是认为在这种情况下,您应该充分利用一种技术(如果您愿意的话),而不是使用两种技术的一半。在这种情况下,如果正则表达式可以做到,那么我认为应该这样做。话虽如此,如果您可以使用 regex/linq/string_functions 作为组合来获得相同的结果,但代码行更少(更简洁),那么 +10 - 这样做。 ;)
【解决方案2】:
string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
MatchCollection conditions = Regex.Matches(rule, pattern);

使用 Match.Value 获取字符串。

【讨论】:

    【解决方案3】:

    这是我想出的一个愚蠢的方法:

    string rule = "1 AND 2 AND 3 OR 4";
    List<string> andsOrs = new List<string>();
    string[] split = rule.Split();
    for (int i = 0; i < split.Length; i++)
    {
       if (split[i] == "AND" || split[i] == "OR")
       {
           andsOrs.Add(split[i]);
       }
    }
    string[] conditions = andsOrs.ToArray();
    return conditions;
    

    【讨论】:

      【解决方案4】:

      既然您知道要查找的确切子字符串...为什么不直接使用 IndexOf(substr, iOffset) 来了解出现次数(循环直到返回 -1)??

      根据您任务的复杂性,它可能比使用正则表达式更简单/更快(因为您没有匹配模式)。

      【讨论】:

        【解决方案5】:

        您可能正在寻找分词器或词法分析器,请查看以下文章:

        C# Regular Expression Recipes—A Better Tokenizer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          • 1970-01-01
          • 2013-06-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-03
          相关资源
          最近更新 更多