Пропустить цитаты в регулярном выражении - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующее регулярное выражение

val=\"(?<val>.*?)\"

все работает нормально для val="value"

Теперь мне нужно регулярное выражение, которое будет соответствовать val="value" и val=value

Не могли бы вы помочь? Я не понимаю, как построить такое регулярное выражение. Я пробовал следующее, но безуспешно

val=[^"](?<val>.*?)[^"]

обновление

кажется, работает val=(?:[^"])*(?<val>.*?)(?:[^"]|")*, но я не уверен, что это правильно

1 Ответ

1 голос
/ 28 января 2020

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

val=(\"?)(?<val>.*?)\1

Обратная ссылка \1 напоминает текст, который соответствует первому выражению в скобках.

Очевидно, что если у вас есть код, который зависит от порядка сгруппированных скобок, вам нужно обратиться ко второй группе, чтобы получить val; но, конечно, вы, вероятно, уже ссылаетесь на него по имени (иначе зачем использовать именованную группу?)

Выражение [^"] соответствует символу, который не кавычка, так что это совершенно неправильно здесь.

Конечно, когда нет кавычек, выражение .*? будет соответствовать пустой строке, если нет конечного контекста, который заставляет его соответствовать чему-то более длинному. Возможно, вы можете использовать что-то вроде

val=(\"?)(?<val>.*?)\1(\s|$)

, но это, очевидно, будет зависеть от того, что именно вы надеетесь сопоставить и в каком контексте. Если нет, то, возможно, вы можете ограничить значение, чтобы вместо этого использовать жадное совпадение? Например,

val=(\"?)(?<val>[^\"]*)\1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...