Регулярное выражение для строкового литерала VHDL - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь разобрать свой код VHDL для некоторых дополнительных проверок.

Я ищу регулярное выражение, которое ищет строковые литералы. Строковый литерал заключен в двойные кавычки следующим образом:

" {characters} "

В настоящее время проблема заключается в следующем требовании:

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

Это означает, что следующие допустимые строковые литералы:

""""  
" random stuff "" random stuff "  

Я не уверен, что:

("(("")*[^\n"]*)*")

достаточно покрывает

Ответы [ 3 ]

6 голосов
/ 05 марта 2012

Если вы хотите сделать полное доказательство, вам может понадобиться полный лексер вместо регулярного выражения.Предложения, которые я здесь читаю, могут вызвать ложные срабатывания, например:

a <= '"'; -- assigns the character " to signal a.

Ваше регулярное выражение будет соответствовать "'; -- assigns the character " здесь.

Опять же, если ваш код не содержит каких-либо странных двойных кавычекв комментариях, символьных литералах или строках для вас подойдет простейшее регулярное выражение.

3 голосов
/ 05 марта 2012

Я надеюсь /"([^"]|"")+"/ будет работать для большинства ваших потребностей.Пожалуйста, попробуйте.

Редактировать: + должно быть *.Сам ОП знает регулярное выражение лучше меня!

0 голосов
/ 05 марта 2012

вы можете попробовать это: (псевдокод / regex / )

/(?<!["\\])"(\w\s)+"(?!")/

, затем используйте обратные ссылки regex:

replace = "\"" + match.$1 + "\""

примечание: это выражение делает наивноепопытка не соответствовать уже сбежавшим двойным кавычкам (оглянуться назад и не увидеть \ или ", но, поскольку \\" фактически будет обычной двойной кавычкой, которой предшествует обычная обратная косая черта, чем больше вы думаете об этом, тем сложнее становится .

...