#c# #.net #regex
Вопрос:
Я изо всех сил пытался найти решение для следующих требований
Входной строки сумма(спец(«любой текст1» : «любой текст2»),спекуляция(«любой текст3» : «любой надпись4»)) я хочу, чтобы соответствовать строку спецификаций(«любой текст1» : «любой текст2») и спецификаций(«любой текст3» : «любой надпись4»))
шаблон, который я попробовал, это Spec(([^)]*))
Этот шаблон работает для ввода выше , но если какой-либо из любых текстов1 ,любой текст2, любой текст3 и любой текст4 содержат круглые скобки, то он не соответствует
ex сумма ввода(Спецификация(«любой текст1 с (скобкой)» : «любой текст2»),спецификация(«любой текст3» : «любой текст4»))
Также возможно, что текст также может содержать кавычки "chassis "4""
.
Комментарии:
1.
bSpec((?>[^()] |(?<c>)(|(?<-c>)))*(?(c)(?!)))
2. Если у вас может быть бродячий
(
или)
внутри"..."
, вам понадобится более конкретное решение, хотя. Но нам понадобится больше деталей, например, возможно ли что"
-то промежуточное"..."
.3. Это работает на вас?
4. да, возможно, что текст также может содержать кавычки
"chassis "4""
5. Я понимаю «да» как «между ними могут быть скобки
"..."
«.
Ответ №1:
Вы можете использовать
(?is)bSpec((?>"[^"\]*(?:\.[^"\]*)*"|[^()]|(?<c>)(|(?<-c>)))*(?(c)(?!)))
Подробные сведения:
(?is)
— модификатор без учета регистраb
— граница словSpec(
—Spec(
текст(?>
— начало атомной группы:"[^"\]*(?:\.[^"\]*)*"
—"..."
строка, которая может содержать экранированные"
символы|
— или[^()]
— любой другой символ, кроме(
и)
|
— или(?<c>)(
—(
символ сопоставляется, и пустое значение перемещается вc
стек группы|
— или(?<-c>))
—)
символ сопоставляется, и пустое значение выводится из стека группc
)*
— конец атомной группы, повторите ноль или более раз(?(c)(?!))
— условная конструкция: если групповойc
стек не пуст, произойдет сбой, вызовет возврат)
—)
шар.