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

в настоящее время я пишу парсер для кода ColdFusion. Я использую регулярное выражение (в c#) для извлечения атрибута источника данных name тега cfquery.

на данный момент регулярное выражение следующим <cfquerys.*datasources*=s*(?:'|")(.*)(?:'|")

Он хорошо работает для строк, таких как <cfquery datasource="myDS" или <cfquery datasource='myDS'

но он сходит с ума при разборе строк, таких как <cfquery datasource="#GetSourceName('myDS')#"

очевидно, часть регулярного выражения (?:'|") является причиной. Есть ли способ соответствовать только одной кавычке, когда в первом матче была одна цитата? И только соответствовать двойной кавычке, когда первый матч был двойной кавычкой?

спасибо заранее!

3 ответов


Edit: я думаю, что это должно работать в C# , вам просто нужно сделать обратную ссылку:

datasource\s*=\s*('|")(.*)(?:)

или, возможно,

datasource\s*=\s*('|")(.*)(?:)

игр datasource="#GetSourceName('myDS')#" С обратной ссылкой на первый матч с .

конечно, вы не можете игнорировать первую группу захвата с ?: и еще есть эта работа. Кроме того, вы можете установить lazy флаг, чтобы не соответствовать дополнительным " ' s


Я бы предложил использовать два разных регулярных выражения, если это возможно, или разделить регулярное выражение по-другому.

для одного регулярного выражения, учитывая вопрос @Mike posted, ("[^"]*")|('[^']*') Затем вы можете разобрать цитаты.

другой потенциальный способ сделать это-использовать lookahead/lookbehind, но это имеет тенденцию становиться грязным и не поддерживается повсеместно.


попробуйте посмотреть на этот пост:

как я могу сопоставить строку с разделителями кавычек с регулярным выражением?

похоже, они имеют дело с той же проблемой.