2

我正在 xQuery 中编写一个 Porter 词干分析器,作为第一步,我需要匹配辅音和元音模式。我用作基础的 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>

但是,在撒克逊人中运行它,我收到以下错误:Query failed with dynamic error: Syntax error at char 17 in regular expression: No expression before quantifier我很确定我的问题是我没有正确构建积极的后视,已将其从 更改<=\1,但我不确定我将如何构建该方面以一种适用于 xQuery 的方式。任何建议将不胜感激。

4

1 回答 1

2

XQuery 3.1 规范的正则表达式支持在https://www.w3.org/TR/xpath-functions-31/#regex-syntax中进行了描述,并指出 XPath 和 XQuery 支持对 XML Schema Datatypes 规范的常规添加https://www.w3.org/TR/xmlschema-2/#regexs上的表达式。不幸的是,后视支持不是规范的一部分。

但是,由于您注意到您使用的是 Saxon,因此 Saxon 有一个扩展,如果您提供j标志,则允许您启用本机 Java 正则表达式,如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。)

于 2018-09-28T16:51:57.957 回答