Вы хотите сказать, что хотите сопоставлять строки в кавычках, только если они не содержат символы новой строки? Если это так, вам не нужно делать ничего особенного, потому что точка не соответствует переводу строки по умолчанию. Помимо +
после вступительных кавычек (что для меня не имеет смысла), ваше регулярное выражение должно работать нормально. Но я поддерживаю предложение Джея, чтобы вы использовали дословные строковые литералы для написания регулярных выражений:
Regex sRegex = new Regex(@"(?<string>"".*""|'.*')");
То, что вам нужно нужно остерегаться, - это жадность. Например, если в одной строке два объявления строк, например:
var s1 = "foo", s2 = "bar";
... регулярное выражение найдет одно совпадение, "foo", s2 = "bar"
, где вы ожидали, что оно совпадет с "foo"
и "bar"
по отдельности. Чтобы избежать этого, вы можете использовать не жадный квантификатор:
Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')");
Если вы делаете хотите сопоставить строки с новыми строками в них, вы можете использовать опцию Singleline
, которая изменяет поведение точки, позволяя ей сопоставлять строки.
Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')",
RegexOptions.Singleline);
... или вы можете использовать встроенный модификатор:
Regex sRegex = new Regex(@"(?s)(?<string>"".*?""|'.*?')");
Имейте в виду, что когда вы используете точку в однострочном режиме, особенно важно использовать негладкий квантификатор, поскольку потенциальные совпадения больше не ограничиваются одной линией. Но вот еще одна альтернатива, более эффективная и предсказуемая:
Regex sRegex = new Regex(@"(?<string>""[^""]*""|'[^']*')");
Нет необходимости указывать однострочный режим с этим регулярным выражением, потому что вы не используете метасимвол точки. Класс отрицанных символов [^"]
соответствует любому символу, кроме кавычки, включая символы новой строки.
Наконец, я хотел бы сказать несколько слов о опции Multiline
, так как кажется, что в этом много путаницы. Люди склонны полагать, что вы должны использовать его всякий раз, когда целевой текст состоит из нескольких строк (то есть, когда он содержит символы новой строки). Это естественное предположение, но это не так.
Все режимы многострочного ввода - это изменение поведения начального и конечного якорей ^
и $
. Обычно они соответствуют только началу и концу всей строки, но если вы включите многострочный режим, они также соответствуют началу и концу логических строк в строке. Например, заданная строка объявлена так:
"fee fie\nfoe fum"
Если вы ищете регулярное выражение ^\w+
в режиме по умолчанию, вы получите одно совпадение: fee
. Но если вы переключитесь в многострочный режим, вы получите два: fee
и foe
. Аналогично, \w+$
соответствует только fum
в режиме по умолчанию, но соответствует fie
и fum
в многострочном режиме. И вы всегда можете сопоставить литерал \n
независимо от того, в каком режиме вы находитесь: однострочный, многострочный или по умолчанию.
Люди также склонны считать, что однострочные и многострочные являются взаимоисключающими, а это не так. Я даже видел, как люди говорят, что однострочный режим является режимом по умолчанию; тоже не правда. Singleline
меняет поведение точки (.
), Multiline
меняет поведение якорей (^
и $
); это все.