Если вы знаете определенный символ не происходит в группе захвата, вы можете использовать заменить этот символ между группами, а затем разметить на нем в XQuery 1.
Например:
tokenize(replace("abc1234", "(.+)(\d+)", "$1-$2"), "-")
для того, чтобы убедиться, что заменить удаляет все до/после группы:
tokenize(replace("abc1234", "^.*?(.+?)(\d+).*?$", "$1-$2"), "-")
Вы можете обобщают, что функции с помощью строки присоединиться, чтобы создать замену р attern как «$ 1- $ 2- $ 3- $ 4» для любого сепаратора:
declare function local:get-matches($input, $regex, $separator, $groupcount) {
tokenize(replace($input, concat("^.*?", $regex, ".*?$"), string-join(for $i in 1 to $groupcount return concat("$", $i), $separator)), $separator, "q")
};
local:get-matches("abc1234", "(.+?)(\d+)", "|", 2)
Если вы не хотите, чтобы указать разделитель самостоятельно, вам нужна функция, чтобы найти один. Каждая строка, длина которой больше входной, не может встречаться в группе захвата, поэтому вы всегда можете найти ее с помощью более длинного разделителя:
declare function local:get-matches($input, $regex, $separator) {
if (contains($input, $separator)) then local:get-matches($input, $regex, concat($separator, $separator))
else
let $groupcount := count(string-to-codepoints($regex)[. = 40])
return tokenize(replace($input, concat("^.*?", $regex, ".*?$"), string-join(for $i in 1 to $groupcount return concat("$", $i), $separator)), $separator, "q")
};
declare function local:get-matches($input, $regex) {
local:get-matches($input, $regex, "|#☎")
};
local:get-matches("abc1234", "(.+?)(\d+)")