题
假设我有字符串“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或词法分析器,看看下面的文章:
既然你知道你正在寻找的确切子......为什么不直接使用的的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;
不隶属于 StackOverflow