Для этого можно использовать регулярное выражение, если вы не вкладываете свои утверждения. Например, если ваш stmt1 - другой регистр, тогда все ставки отключены (вы не можете использовать регулярные выражения для чего-то подобного, вам нужен обычный анализатор).
Редактировать : Если вы действительно хотите попробовать это, вы можете сделать это с чем-то вроде (не проверено, но вы поняли идею):
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?;)", RegexOptions.Singleline)
allMatches = t.Matches(input_string)
Но, как я уже сказал, это будет работать только для не вложенных утверждений.
Редактировать 2 : Регулярное выражение немного изменено, чтобы включить точку с запятой в последнюю группу. Это не будет работать так, как вы хотели - вместо этого вы получите несколько совпадений, и каждое совпадение будет представлять одно , когда условие, с первой группой условие и вторая группа оператор. 1016 *
Я не думаю, что вы можете создать регулярное выражение, которое будет делать именно то, что вы хотите, но это должно быть достаточно близко (я надеюсь).
Редактировать 3 : новое регулярное выражение - должно обрабатывать несколько операторов
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?)(?=(when|end))", RegexOptions.Singleline)
Он содержит положительный прогноз, так что вторая группа соответствует от , затем до следующего 'когда' или 'конца'. В моем тесте это работало с этим:
case a
when cond1
then stmt1;
stm1;
stm2;stm3
when cond2
then stmt2;
aaa;
bbb;
end case;
Пока он чувствителен к регистру, поэтому если вам нужна нечувствительность к регистру, вам нужно добавить соответствующий флаг регулярного выражения.