XDMP-REGEX: (err: FORX0002) - Строковое преобразование с регулярными выражениями - PullRequest
0 голосов
/ 06 октября 2018

Я работаю над требованием xquery для определения имени тега xml () из документа XML с помощью регулярного выражения.Позже будет выполнено преобразование данных. Он выполняет поиск по всему документу, и, если я нашел совпадение, я делаю строку: замените на xquery / xpath.

Найдите пример кода, который я ищу.

let $full-doc := fn:doc($uri)
if(fn:matches($full-doc,"<Hyperlink\b[^\>]*?>([A-Z][a-z]{2} [0-3]?[0-9] 
[12][890][0-9]{2})</Hyperlink>")) 
then $full-doc 
else "regex is not working"

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

regex-match :
[1.0-ml] XDMP-REGEX: (err:FORX0002) fn:matches(fn:doc("44215.xml"), " 
<Hyperlink\b[^\>]*?>([A-Z][a-z]{2} [0-3]?[0-9] [12][890][0-9]{2}...") - 
- Invalid regular expression

Может кто-нибудь объяснить, почему мое регулярное выражение не работает?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Рассматривая ваше требование:

Я работаю над требованием xquery для идентификации имени тега xml () из документа XML с помощью регулярного выражения.

Вы являетесьидти по этому пути совершенно неправильно.XQuery не видит лексический XML, он видит дерево узлов.Чтобы найти имя элемента, используйте выражение XPath, чтобы найти элемент, а затем используйте функцию name(), чтобы получить его имя.

Если вы хотите найти элемент, имя которого соответствует регулярному выражению, используйте //*[matches(name(), $regex)]

0 голосов
/ 06 октября 2018

Код границы слова \b не поддерживается в XQuery (см. https://www.w3.org/TR/xpath-functions-31/#regex-syntax).

Но я думаю, вы ищете элементы Hyperlink, а не подстроку <Hyperlink>, поэтому вам следует использоватьвыражение пути:

let $doc := fn:doc($uri)
where $doc//Hyperlink[matches(., '([A-Z][a-z]{2} [0-3]?[0-9] [12][890][0-9]{2})')]
return $doc
...