Модуль 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 ''
 } ;

вы получите правильное совпадение и замену и сравнение.

К сожалению, это не работает ни надежно. Возьмем этот пример, где слово «конец» удаляется из обеих строк, а не только из последней строки:

Другие вопросы по тегам