Регулярное выражение С# для соответствия строке с разделителем

Я хочу получить строку с разделителем между двумя конкретными словами, используя регулярное выражение.

например Мне нужно регулярное выражение, которое соответствует:

Операторы1 start Операторы2 ; Заявления3 заканчиваются весельем;

Между «началом» и «концом» может быть несколько вхождений «;».

Операторы — это несколько слов, где (.*) может использоваться в регулярном выражении для слова.

Но регулярное выражение не должно совпадать, если между «началом» и «концом» нет «;».

Кроме того, «конец» должен быть первым «концом», встречающимся после «начала».

Итак, регулярное выражение не должно совпадать

Операторы1 start Операторы2 end Операторы3 ; конец веселья

Я хочу спички как

  1. операторы перед «началом»
  2. ключевое слово
  3. утверждения после слова «начало»

Итак, в этом случае это будет группа (для 1-й строки, поскольку 2-я не должна совпадать) как:

  1. Заявления1
  2. Начало
  3. Заявления2 ; Заявления3 заканчиваются весельем;

person Archie    schedule 13.03.2009    source источник


Ответы (4)


Таким образом, приведенное ниже регулярное выражение будет соответствовать вашему положительному случаю и не будет соответствовать отрицательному случаю и поместит результаты в группы 1, 2 и 3.

(.*?) (start) ((?:(?:.*?) ;)+ (?:.*?) end fun)

Если вы не знакомы с синтаксисом (?:) - они означают незахватывающие круглые скобки. Ознакомьтесь с Освоение регулярных выражений, это отличный справочник по этой теме!

person Gavin Miller    schedule 13.03.2009
comment
да, я знаком с синтаксисом ?:. Но мне жаль говорить, что это регулярное выражение не работает. - person Archie; 16.03.2009

Может быть быстрее использовать

    string[] Strings = stringToSplit.Split(new char[] { ';' });
    if (Strings.Count() > 1)
    {
        // Do your stuff
    }
person Lazarus    schedule 13.03.2009

Похоже, то, что вы хотите, так же просто, как:

(.*)(start)(.*;.*end.*)

Это вернет группы, которые вы перечисляете.

person P Daddy    schedule 13.03.2009
comment
Вам нужны нежадные квалификаторы на *, иначе он будет соответствовать последнему концу, а не первому. - person Jesse Rusak; 13.03.2009
comment
Вы абсолютно правы, хотя замена ленивых * приводит к тому, что финальная забава группируется; со следующим матчем. Не уверен, насколько это важно. - person P Daddy; 13.03.2009

person    schedule
comment
Это не соответствует требованиям захвата - person Gavin Miller; 13.03.2009
comment
Боль, когда это происходит, не так ли! - person Gavin Miller; 13.03.2009