C #: поиск экземпляров строки в строке - PullRequest
0 голосов
/ 11 мая 2009

Предположим, у меня есть строка "1 И 2 ​​И 3 ИЛИ 4", и я хочу создать массив строк, содержащий все подстроки "И" или "ИЛИ" в порядке, найденном в строке.

Таким образом, приведенная выше строка будет возвращать строковый массив {"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", "AND", "2", "AND", "3", "OR", "4"}, что не совсем то, что я ищу. Как я могу свести это только к AND и OR?

Ответы [ 5 ]

1 голос
/ 11 мая 2009
string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
MatchCollection conditions = Regex.Matches(rule, pattern);

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

1 голос
/ 11 мая 2009

Это регулярное выражение (.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));
1 голос
/ 11 мая 2009

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

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

1 голос
/ 11 мая 2009

Вы, вероятно, ищете токенизатор или Lexer, взгляните на следующую статью:

C # Рецепты регулярных выражений - лучший токенизатор

0 голосов
/ 11 мая 2009

Вот глупый способ, которым я придумал:

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;
...