C#:在字符串中查找字符串的实例

时间:2009-05-11 04:56:56

标签: c# string matching

假设我有字符串“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?

5 个答案:

答案 0 :(得分:1)

您可能正在寻找令牌或Lexer,请查看以下文章:

C# Regular Expression Recipes—A Better Tokenizer

答案 1 :(得分:1)

这个正则表达式(.NET)似乎做你想要的。您正在寻找索引= 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));

答案 2 :(得分:1)

既然你知道你正在寻找的确切子串...为什么不用IndexOf(substr, iOffset)来知道出现次数(循环直到它返回-1)??

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

答案 3 :(得分:1)

string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
MatchCollection conditions = Regex.Matches(rule, pattern);

使用Match.Value获取字符串。

答案 4 :(得分:0)

这是我提出的一种愚蠢的方式:

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;