Вы можете захватить необязательную открывающую кавычку и требовать, чтобы она присутствовала в конце совпадения.
val=(\"?)(?<val>.*?)\1
Обратная ссылка \1
напоминает текст, который соответствует первому выражению в скобках.
Очевидно, что если у вас есть код, который зависит от порядка сгруппированных скобок, вам нужно обратиться ко второй группе, чтобы получить val
; но, конечно, вы, вероятно, уже ссылаетесь на него по имени (иначе зачем использовать именованную группу?)
Выражение [^"]
соответствует символу, который не кавычка, так что это совершенно неправильно здесь.
Конечно, когда нет кавычек, выражение .*?
будет соответствовать пустой строке, если нет конечного контекста, который заставляет его соответствовать чему-то более длинному. Возможно, вы можете использовать что-то вроде
val=(\"?)(?<val>.*?)\1(\s|$)
, но это, очевидно, будет зависеть от того, что именно вы надеетесь сопоставить и в каком контексте. Если нет, то, возможно, вы можете ограничить значение, чтобы вместо этого использовать жадное совпадение? Например,
val=(\"?)(?<val>[^\"]*)\1