Регулярное выражение для сопоставления кавычек и одинарных кавычек
в настоящее время я пишу парсер для кода 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, но это имеет тенденцию становиться грязным и не поддерживается повсеместно.
попробуйте посмотреть на этот пост:
как я могу сопоставить строку с разделителями кавычек с регулярным выражением?
похоже, они имеют дело с той же проблемой.