Regex для анализа исходного кода C #, чтобы найти все строки - PullRequest
2 голосов
/ 08 июня 2009

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

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

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

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

  • «av \» d »
  • @ ”ab” ”cd”
  • @ ”ab” ””
  • @ ”” ”ab”
  • и т.д.

Ответы [ 4 ]

8 голосов
/ 09 июня 2009

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

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

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

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

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

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

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

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

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

6 голосов
/ 08 июня 2009

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

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

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

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

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

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

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

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

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

0 голосов
/ 01 ноября 2010

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

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

"((\") | [^ "\] | \) "

дословная строка:

@ ( "[^"] * ") +

0 голосов
/ 08 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...