Regex для синтаксического анализа исходного кода на C #, чтобы найти все строки

Я задал этот вопрос давным-давно, мне жаль, что я не прочитал ответы на вопрос, когда сначала не использовать Regex в C # (или Java, C ++ и т. Д.) !

Я хочу использовать Regex (регулярные выражения), чтобы получить список всех строк в исходном коде C #, включая строки, в которые встроены двойные кавычки.

Это не должно быть сложно, однако, прежде чем я потрачу время на создание выражения Regex, кто-нибудь уже получил «предварительно консервированный»?

Это не так просто, как кажется

  • «Пр \» д»
  • @»Абы»»CD»
  • @»Абы»»»
  • @»»»Абы»
  • так далее

Я отправляю это как свой ответ, поэтому он выделяется другим, читающим вопросы.

Как было указано в полезных комментариях к моему вопросу, ясно, что регулярное выражение не является хорошим инструментом для поиска строк в коде C #. Я мог бы написать простой «парсер» за время, которое я потратил, напоминая себе о синтаксисе регулярных выражений. – (Parser – это надбавка, поскольку нет комментариев в комментариях и т. Д., Это мой исходный код, с которым я имею дело).

Кажется, это хорошо подводит итог:

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.

Однако, пока он не сломается на моем коде, я буду использовать регулярное выражение, которое опубликовал Blixt, но если это даст мне проблемы, я не буду тратить время на совпадение, пытаясь исправить его, прежде чем писать собственный парсер. Например, как строка C #, это

@"@Q(?:[^Q]+|QQ)*Q|Q(?:[^Q\\]+|\\.)*Q".Replace('Q', '\"') 

Update, у вышеупомянутого regEx возникла проблема, поэтому я просто написал свой собственный парсер, в том числе для написания модульных тестов потребовалось около 2 часов, чтобы написать парсер. Это намного меньше времени, чем я трачу, просто пытаясь найти (и проверить) предварительно законченное Regex в Интернете.

Проблема, которую я вижу, заключается в том, что я стараюсь избегать Regex и просто писать код обработки строки сам, а потом многие люди утверждают, что я трачу деньги клиента, не используя Regex. Однако всякий раз, когда я пытаюсь использовать Regex, похоже, что простой шаблон совпадения становится более быстрым. (Нет онлайновых статей об использовании Regex в .net, который я прочитал, имеют хорошую инструкцию, которая дает понять, когда НЕ использовать Regex. Аналогично, с его документацией MSDN)

Давайте посмотрим, можем ли мы помочь решить эту проблему, я только что создал вопросы переполнения стека « Когда не использовать Regex »

Регулярное выражение для нахождения строк в стиле C:

 "(?:[^"\\]+|\\.)*" 

Это не учитывает комментарии, поэтому лучше всего удалять все комментарии, используя следующее регулярное выражение:

 /\*(?s:(?!\*/).)*\*/|//.* 

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

Обновление: Изменено регулярное выражение для комментариев, чтобы использовать флаг DOTALL для многострочных комментариев.

Кроме того, вы можете поддерживать литеральные строки, поэтому используйте это вместо другого регулярного выражения строки:

 @"(?:[^"]+|"")*"|"(?:[^"\\]+|\\.)*" 

И напоминание: не используйте DOTALL в качестве глобального флага для любого из этих регулярных выражений, так как он разбивает однострочные комментарии и однострочные строки (обычные строки однострочные, а литеральные строки могут охватывать несколько строк. )

Через http://www.regular-expressions.info :

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*" соответствует однострочной строке, в которой может отображаться символ кавычки, если он экранирован обратная косая черта. Хотя это регулярное выражение может показаться более сложным, чем должно быть, оно намного быстрее, чем более простые решения, которые могут привести к большому оттоку в случае, если двойная кавычка появляется где-то сама по себе, а не как часть строки. "[^"\\]*(?:\\.[^"\\]*)*" позволяет строке охватывать несколько строк.

Мое выражение в 5 центов, которое я использую в своем собственном парсере C #:

нормальная строка:

“((\”) | [^ “\] | \)

строка verbatim:

@ ( “[^”] * “) +