2015-08-10 8 views
1

Я использую JRuby 1.7.18 и даже попробовал это в JRuby 9000 (последняя версия), где я получаю ту же ошибку. Я использую библиотеки soap-4r и nokogiri для разбора файла wsdl xml.RegexpError в Ruby при анализе свойства символа p {IsBasicLatin}

Когда ниже часть WSDL анализируется

<xs:pattern value="[\p{IsBasicLatin}]*"/> 

Я получаю следующую ошибку

RegexpError: (RegexpError) invalid character property name <IsBasicLatin>: /\A[\p{IsBasicLatin}]*\z/n 
nokogiri/XmlSaxParserContext.java:252:in `parse_with' 
nokogiri/XmlSaxParserContext.java:252:in `parse_with' 
nokogiri/XmlSaxParserContext.java:252:in `parse_with' 

В Ruby 1.9, которая является одной из версий Ruby, что JRuby 1.7.18 совместим с, я читал, что блоки символов, такие как \p{IsBasicLatin}, не поддерживаются. Но поддерживаются сценарии, такие как \p{Latin}. Я попытался изменить IsBasicLatin на Latin и даже попробовал несколько других, таких как InBasicLatin и InBasic_Latin, но все они возвращают ту же ошибку.

Это как в JRuby 1.7.18, так и в JRuby 9000, которая является последней версией.

Что здесь не так, и как я могу это исправить?

+0

Это 'In_Basic_Latin'. Возможно, кодировка regexp не является Unicode (модификатор 'u' для UTF-8, но это должно быть значение по умолчанию), или JRuby 9000 не поддерживает свойства символа (по крайней мере, те)? – cremno

+0

@cremno Я попробовал 'In_Basic_Latin' и получил ту же ошибку. Кроме того, я думал, что это проблема с Unicode, поэтому я искал исходный код nokogiri, и его кодировка определенно устанавливается в 'UTF-8'. Там он жестко закодирован. Если его как-то не потерять, когда он перейдет на Java. Если вы заметили в моем журнале ошибок выше исходных файлов, это фактически классы java. – Graham

+0

Сообщите об этом команде JRuby. 'IsBasicLatin' ошибочен (в Ruby), но' In_Basic_Latin' должен работать. Редактирование файла для исправления ошибки в порядке, не так ли? – cremno

ответ

0

Как указано в комментариях, имя свойства символа на самом деле In_Basic_Latin, а не IsBasicLatin. Современные версии Ruby (например, MRI или CRuby) используют библиотеку регулярных выражений Onigmo. Официальные документы Ruby не перечисляют все свойства Unicode, но, к счастью, Onigmo does.

По-видимому, JRuby, похоже, не реализует (по крайней мере) блок Unicode. Однако информация (название и диапазон) о блоках - publicly accessible. \p{In_Basic_Latin} поэтому эквивалентен [\u0000-\u007F]. Так и есть [[:ascii:]].

+0

Сменив его с [\ p {In_Basic_Latin}] на [\ u0000- \ u007F], спасибо, спасибо! – Graham