我正在xQuery中编写Porter提取器,并且第一步,我需要匹配辅音和元音模式。我以此为基础的Perl示例中的辅音匹配序列为(?:[^aiueoy]|(?:(?<=[aiueo])y)|\by)
,元音序列为(?:[aiueo]|(?:(?<![aiueo])y))
。我需要扩展它,使其也包括字母aesc(æ),所以这就是我的xquery regex的内容:
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兼容的方式构建该方面。任何建议将不胜感激。
答案 0 :(得分:2)
在https://www.w3.org/TR/xpath-functions-31/#regex-syntax中描述了XQuery 3.1规范的正则表达式支持,请注意,在https://www.w3.org/TR/xmlschema-2/#regexs,XPath和XQuery支持对正则表达式的XML Schema Datatypes规范的一些补充。不幸的是,向后支持不属于规范的一部分。
但是,由于您注意到您使用的是Saxon,所以Saxon具有扩展名,可以通过提供j
标志来启用本机Java正则表达式,如https://www.saxonica.com/html/documentation/functions/fn/matches.html所述。这应该使您可以访问Java对正向后向表达式的支持。
(此j
标志正在成为其他XQuery实现中的一种扩展约定。如http://docs.basex.org/wiki/XQuery_Extensions#Regular_Expressions所述,BaseX遵循Saxon。eXist也可能会采用以下约定:https://github.com/eXist-db/exist/issues/846。 )