0

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

4

5 回答 5

1

您可能正在寻找标记器或 Lexer,请查看以下文章:

C# 正则表达式配方——更好的分词器

于 2009-05-11T05:01:40.160 回答
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));
于 2009-05-11T05:09:05.093 回答
1

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

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

于 2009-05-11T05:37:03.083 回答
1
string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
MatchCollection conditions = Regex.Matches(rule, pattern);

使用 Match.Value 获取字符串。

于 2009-05-11T06:24:34.813 回答
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;
于 2009-05-11T05:49:59.363 回答