Как сопоставить строку со сложными разделителями (регулярное выражение в ruby) - PullRequest
0 голосов
/ 17 августа 2010

Я бы хотел сопоставить пары атрибутов из строки, подобной приведенной ниже

<tag_name attra="#{t("a.b.c")}" attrb="aa a">

... должно совпадать на

ATTRA = "# {т (" A.B.C ")}" а также attrb = "aa a"

спасибо заранее Marius

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Вы можете использовать lookaheads, чтобы определить, являются ли заключенные кавычки частью значения или нет, посмотрев, за ними следует пробел или '>'

ruby-1.8.7-p248 > s='<tag_name attra="#{t("a.b.c")}" attrb="aa a">'
=> "<tag_name attra=\"\#{t(\"a.b.c\")}\" attrb=\"aa a\">" 
ruby-1.8.7-p248 > s.scan /\w+=".*?"(?=\s|>)/
=> ["attra=\"\#{t(\"a.b.c\")}\"", "attrb=\"aa a\""] 

Конечно, это победило 'Это не сработает, если в вашем значении атрибута есть кавычка, за которой следует пробел или символ «>», поэтому независимо от того, как вы на это смотрите, это проигрышная битва, если вы не пропустите эти кавычки внутри значений атрибута или не обработаете их каким-либо образом.По этой причине строка и регулярное выражение каждого языка имеют разделители, которые должны быть пропущены или предварительно обработаны, если они находятся внутри значения с разделителями.

0 голосов
/ 17 августа 2010

Если бы в значениях атрибута не было кавычек (например, attrb="aa a") или если кавычки были экранированы как сущности (например, attrib="&quot;Hello,&quot; he said"), тогда было бы действительно легко сделать регулярное выражение в строках

/\w+="[^"]*"/

Однако, поскольку вы действительно пытаетесь сопоставить attra="#{t("a.b.c")}", который является частью некоторого кода Ruby, который генерирует XML (и который сам по себе не является допустимым XML), даже синтаксический анализатор XML (такой как REXML или Nokogiri) не будет решить эту проблему для вас. Вам потребуется собственный контекстно-свободный синтаксический анализатор или пользовательская библиотека ripper , входящая в стандартную библиотеку Ruby 1.9.1, для анализа частей атрибута, которые являются интерполированным кодом Ruby, и затем используйте какой-нибудь хитрый хак (например, заменив интерполированный код рубина специальной строкой символов), чтобы сопоставить значение атрибута.

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