假设我有字符串“1和2以及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”, “和”, “2”, “AND”, “3”, “或”, “4”},这是不太我后。我怎样才能减少到AND和OR只?

有帮助吗?

解决方案

这正则表达式(.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));

其他提示

您可能寻找一个tokeniser或词法分析器,看看下面的文章:

C#正则表达式食谱-A更好的分词器

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

根据你的任务的复杂性,它可能是简单/比使用正则表达式(因为你不符合格式)。快

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

使用Match.Value得到的字符串。

下面就是我想出了一个愚蠢的方式:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top