RegexpError в Ruby при разборе свойства символа \p{IsBasicLatin}

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

Когда нижеприведенная часть 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, которая является последней версией.

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


person Graham    schedule 10.08.2015    source источник
comment
Это In_Basic_Latin. Может быть, кодировка регулярного выражения не является Unicode (модификатор u для UTF-8, но он должен быть по умолчанию) или JRuby 9000 еще не поддерживает свойства символов (по крайней мере, те)?   -  person cremno    schedule 10.08.2015
comment
@cremno Я попробовал In_Basic_Latin и получил ту же ошибку. Кроме того, я подумал, что это тоже проблема с Unicode, поэтому я просмотрел исходный код nokogiri, и его кодировка определенно устанавливается на UTF-8. Там это жестко закодировано. Если только он не потеряется при переходе на Java. Если вы заметили в моем журнале ошибок выше, исходные файлы на самом деле являются классами Java.   -  person Graham    schedule 10.08.2015
comment
Сообщите об этом команде JRuby. IsBasicLatin неверно (в Ruby), но In_Basic_Latin должно работать. Редактирование файла для исправления ошибки — это нормально, не так ли?   -  person cremno    schedule 10.08.2015
comment
@cremno да, это то, что я имел в виду, когда сказал, что пытался In_Basic_Latin. Я отредактировал файл wsdl, чтобы он использовал его вместо IsBasicLatin. Думаю, мне придется связаться с разработчиками JRuby.   -  person Graham    schedule 10.08.2015


Ответы (1)


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

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

person cremno    schedule 10.08.2015
comment
Изменение его с [\p{In_Basic_Latin}] на [-] сработало, спасибо! - person Graham; 11.08.2015