2009-05-11 4 views
0

Предположим, что у меня была строка «1 AND 2 AND 3 OR 4», и вы хотите создать массив строк, который содержит все подстроки «AND» или «OR», для того, чтобы , найденные внутри строки.C#: поиск экземпляров строки в строке

Таким образом, указанная выше строка вернет массив строк из {"AND", "AND", "OR"}.

Что было бы разумным способом написать это?

EDIT: Использование C# 2.0+,

string rule = "1 AND 2 AND 3 OR 4"; 
string pattern = "(AND|OR)"; 
string[] conditions = Regex.Split(rule, pattern); 

дает мне { "1", "И", "2", "И", "3", "ИЛИ", "4"} , что не совсем то, что мне нужно. Как я могу уменьшить это только для AND и OR?

+0

Я вижу, что вы пытаетесь сделать, но я не думаю, что подход «Сплит» наиболее подходит для того, что вы хотите. См. Раздел «Разделение» - это разделение ввода на AND и OR, что приводит к тому, что числа (и только AND/ORs coz в скобках) - это не то, что вы хотите. Вы хотите использовать AND и OR. Я думаю, что созданный шаблон регулярного выражения может возвращать несколько совпадений, таким образом захватывая только И и ИЛИ. –

+0

Не могли бы вы объяснить цель, если это требование? Это может помочь в разработке более подходящего регулярного выражения. –

ответ

1

Это регулярное выражение (.NET), кажется, что вы хотите. Вы ищете матчей (несколько) в группе в индексе = 1:

.*?((AND)|(OR))*.*? 

EDIT Я проверил следующее, и это, кажется, что вы хотите. Это больше строк, чем я хотел, но он подходит к задаче чисто регулярных выражений моды (что ИМХО это то, что вы должны делать):

 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)); 
+0

Почему не просто «(И | ИЛИ)»? – cdmckay

+0

* Пожимает плечами * Может быть, я переусердствовал. –

+0

В C# 2.0+, используя «AND | OR», поскольку шаблон дает мне больше, чем просто ANDs и ORs - как я могу получить ограничение на шаблон, чтобы дать мне только AND и OR? Я отредактировал вопрос выше. –

1

Поскольку вы знаете точное подстроку, которую вы ищете ... почему не просто используйте IndexOf(substr, iOffset), чтобы узнать количество событий (цикл до тех пор, пока он не вернется -1)?

В зависимости от сложности вашей задачи это может быть проще/быстрее, чем при использовании регулярных выражений (поскольку вы не соответствуете шаблонам).

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; 
1
string rule = "1 AND 2 AND 3 OR 4"; 
string pattern = "(AND|OR)"; 
MatchCollection conditions = Regex.Matches(rule, pattern); 

Используйте Match.Value, чтобы получить строку.

Смежные вопросы