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