特定の文字がキャプチャ グループ内に存在しないことがわかっている場合は、グループ間でその文字に置き換えてから、XQuery 1 でトークン化できます。
例えば:
tokenize(replace("abc1234", "(.+)(\d+)", "$1-$2"), "-")
置換によってグループの前後のすべてが削除されるようにするには:
tokenize(replace("abc1234", "^.*?(.+?)(\d+).*?$", "$1-$2"), "-")
string-join を使用して、任意のセパレータに対して "$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+)")