Положительный взгляд назад в xquery

Я пишу стеммер Портера в xQuery, и в качестве первого шага мне нужно сопоставить шаблоны согласных и гласных. Последовательность соответствия согласных из примера Perl, которую я использую в качестве основы для этого, — (?:[^aiueoy]|(?:(?<=[aiueo])y)|\by), а последовательность гласных — (?:[aiueo]|(?:(?<![aiueo])y)). Мне нужно расширить это, чтобы также включить букву aesc (æ), и вот что у меня есть для моего регулярного выражения xquery:

let $v := element {"vowels"} {matches($f,"(?:([^aiueoy])|(?:(?:[aiueo]\1)y))")}
let $c := element {"consonants"} {matches($f,"(?:([aiueo])|(?:(?<![aiueo]\1)y))")}

Пример типа XML, который я ищу, выглядит следующим образом:

<entry ref="173">
        <headword>abǒve</headword>
        <headword>abǒven</headword>
        <variant>abufe</variant>
        <variant>abufen</variant>
        <variant>abuue</variant>
        <variant>abuuen</variant>
        <variant>abowve</variant>
        <variant>obove</variant>
        <variant>oboven</variant>
        <variant>obufe</variant>
        <variant>obufen</variant>
        <variant>abof</variant>
        <variant>obof</variant>
        <variant>aboyf</variant>
        <variant>aboun</variant>
        <variant>aboune</variant>
        <variant>abown</variant>
        <variant>abowne</variant>
        <variant>aboon</variant>
        <variant>oboun</variant>
        <variant>oboune</variant>
        <variant>abow</variant>
        <variant>aboʒe</variant>
        <part_of_speech> adv. </part_of_speech>
    </entry>

Однако, запустив это в Saxon, я получаю следующую ошибку: Query failed with dynamic error: Syntax error at char 17 in regular expression: No expression before quantifier Я почти уверен, что моя проблема в том, что я неправильно строю положительное ретроспективное представление, изменив его с <= на \1, но я не уверен, как мне это сделать. создайте этот аспект таким образом, чтобы он работал с xQuery. Любые предложения будут высоко ценится.


person medievalmatt    schedule 28.09.2018    source источник
comment
Я не думаю, что XQuery не поддерживает ни группы без захвата, ни просмотр назад. Меня смущает то, на что вы пытаетесь сослаться с помощью обратной ссылки \1, не могли бы вы добавить ожидаемый вывод XML? Также я думаю, что вы инвертировали гласные и согласные в своем коде XQuery, иначе я также не понимаю, почему вы хотите сопоставить [aiueo] как согласные и [^aiueo] как гласные   -  person Aaron    schedule 28.09.2018
comment
Если возможно, я бы предложил использовать для этой работы другой язык, а не XQuery, его поддержка регулярных выражений ограничена, и похоже, что основная часть вашей работы — обработка текста, а обработка XML — вторична.   -  person Aaron    schedule 28.09.2018


Ответы (1)


Поддержка регулярных выражений в спецификации XQuery 3.1 описана по адресу https://www.w3.org/TR/xpath-functions-31/#regex-syntax, отмечая, что XPath и XQuery поддерживают несколько дополнений к спецификации типов данных схемы XML для регулярных выражений по адресу https://www.w3.org/TR/xmlschema-2/#regexs. К сожалению, ретроспективная поддержка не является частью спецификации.

Однако, поскольку вы заметили, что используете Saxon, у Saxon есть расширение, которое позволяет вам включить собственное регулярное выражение Java, если вы укажете флаг j, как описано на https://www.saxonica.com/html./documentation/functions/fn/matches.html. Это должно дать вам доступ к поддержке положительных выражений обратного просмотра в Java.

(Этот флаг j становится своего рода соглашением о расширении среди других реализаций XQuery. BaseX следует за Saxon, как указано в http://docs.basex.org/wiki/XQuery_Extensions#Regular_Expressions. eXist, вероятно, тоже примет это соглашение: https://github.com/eXist-db/exist/issues/846.)

person Joe Wicentowski    schedule 28.09.2018
comment
Спасибо за указание на это. На самом деле я зашел на страницу Saxon, о которой вы упомянули (поэтому я был уверен, что группы без захвата теперь в порядке), но я пропустил этот флаг. Я собираюсь попробовать это. - person medievalmatt; 29.09.2018