Functx模块和带有字符结尾的长字符串

问题描述

我遇到了functx模块处理行尾字符的字符串的问题。以下代码应该可以使用(?)

DATASET ACTIVATE DataSet1.
USE ALL.
COmpuTE filter_$=(McDonalds = 0 | RedBull = 1 | TacoBell = 1).
VARIABLE LABELS filter_$ 'McDonalds = 0 | RedBull = 1 | TacoBell = 1 (FILTER)'.
VALUE LABELS filter_$ 0 'Not Selected' 1 'Selected'.
FORMATS filter_$ (f1.0).
FILTER BY filter_$.
EXECUTE.

但是失败了

预期为“其他”,其他为“其他” 返回。

删除换行符可使测试正常进行。我不明白的是什么? :)

BR

解决方法

我认为问题出在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?,'$1','m')
   else ''
 } ;

您将获得正确的匹配以及替换和比较。