Попробуйте следующее RegEx ( Редактировать: исправлено).
(?:[^\"]|(?:(?:.*?\"){2})*?)(?: |^)(?<kw>for|while|if)[ (]
Примечание. Поскольку этот литерал RegEx содержит кавычки, перед строкой нельзя использовать знак @. Помните, что если вы добавите в строку какие-либо специальные символы RegEx, вам нужно будет дважды экранировать их приблизительно (например, \ w). Убедитесь, что вы также указали параметр Multiline при сопоставлении с RegEx, чтобы символ вставки (^) считался началом новой строки.
Это не было проверено, но должно делать эту работу. Дайте мне знать, если есть какие-либо проблемы. Кроме того, в зависимости от того, что еще вы хотите здесь сделать, я мог бы рекомендовать использовать стандартный синтаксический анализ текста (не-RegEx), поскольку он быстро станет более читабельным в зависимости от того, сколько данных вы хотите извлечь из кода. Надеюсь, это поможет в любом случае.
Edit:
Вот пример кода, который я протестировал и уверен, что он работает как задумано.
var input = "while t < 10 loop\n s => 'this is if stmt'; for u in 8..12 loop \n}";
var pattern = "(?:[^\"]|(?:(?:.*?\"){2})*?)(?: |^)(?<kw>for|while|if)[ (]";
var matches = Regex.Matches(input, pattern);
var firstKeyword = matches[0].Groups["kw"].Value;
// The following line is a one-line solution for .NET 3.5/C# 3.0 to get an array of all found keywords.
var keywords = matches.Cast<Match>().Select(match => match.Groups["kw"].Value).ToArray();
Надеюсь, это будет ваше полное решение сейчас ...