Модуль Functx и длинные строки с концом символов
У меня возникла проблема с модулем functx, работающим со строками с символами конца строки. Следующий код должен работать (?)
declare %unit:test function test:substring-before-last() {
let $title := 'Something
blah other'
let $expected-title := 'Something
blah'
return unit:assert-equals(functx:substring-before-last($title, ' other'),
$expected-title)
};
Однако это дает сбой
"Что-то бла" ожидалось, "Что-то бла другое" вернулось.
Удаление разрыва строки делает тест работающим. Что я не понимаю?:)
BR
2 ответа
Я думаю, проблема заключается в определении или реализации функции functx http://www.xqueryfunctions.com/xq/functx_substring-before-last.html:
declare function functx:substring-before-last
( $arg as xs:string? ,
$delim as xs:string ) as xs:string {
if (matches($arg, functx:escape-for-regex($delim)))
then replace($arg,
concat('^(.*)', functx:escape-for-regex($delim),'.*'),
'$1')
else ''
} ;
и точка регулярного выражения
.
соответствие и
replace
по умолчанию "Если входная строка не содержит подстроки, которая соответствует регулярному выражению, результатом функции будет одна строка, идентичная входной строке."; если вы добавите флаги
m
аргумент
declare function functx:substring-before-last
( $arg as xs:string? ,
$delim as xs:string ) as xs:string {
if (matches($arg, functx:escape-for-regex($delim)))
then replace($arg,
concat('^(.*)', functx:escape-for-regex($delim),'.*'),
'$1', 'm')
else ''
} ;
вы получите правильное совпадение и замену и сравнение.
К сожалению, это не работает ни надежно. Возьмем этот пример, где слово «конец» удаляется из обеих строк, а не только из последней строки: