问题描述
我遇到了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 ''
} ;
您将获得正确的匹配以及替换和比较。