假设我有字符串“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?
答案 0 :(得分:1)
您可能正在寻找令牌或Lexer,请查看以下文章:
答案 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;