【发布时间】:2021-11-24 23:13:31
【问题描述】:
我离我的问题的解决方案只有一英寸的距离。我正在尝试对通过 SPARQL 检索到的字符串进行标题大小写转换。我将 REPLACE 函数与 LCASE 和 REGEX 结合使用:
BIND (replace(lcase(?label), "(\\b[a-z](?!\\s))", ucase("$1") ) as ?title_case)
lcase(?label):字符串中的所有字符变为小写
(\\b[a-z](?!\\s)):匹配字符串中每个单词的首字母
ucase($1): 是对匹配的第一个字母的反向引用,将其转换为大写后作为替换。
预期结果:animal husbandry methods 变为 Animal Husbandry Methods
由于我无法理解的原因,该解决方案几乎可以正常工作,但并不完全正确;查看here 工作中的示例。
当您运行查询时,您不会注意到 ?title_case 有任何不同,但如果您将 ucase("$1") 编辑为 ucase("aaa"),您会看到它神奇地正确替换了每个单词的第一个字母:
结果:animal husbandry methods 变为 AAAnimal AAAusbandry AAAethods
在我看来,UCASE 函数对反向引用 $1 没有任何影响
谁能向我解释为什么会这样,如何纠正这种行为?
【问题讨论】:
-
在转向使用
ucase($1)之前,我尝试了使用 REGEX 附带的\U$1\E的解决方案,其中 \U 开始大写,而 \E 结束它。我还没有找到正确的字符转义形式,这使得 SPARQL 有效并且结果符合我的预期! -
我不太确定您在哪里找到了
\U和\E命令。我无法在 SPARQL 规范中找到它们,也无法在从中获取replace的 XPath 中找到它们。 -
我试图使用我发现解释的 \U \E 方法here 但出于挫败感再次尝试了许多尝试。
-
啊,是的,这似乎只适用于 vim。但是,在所有正则表达式方言中都有肯定会很好。
标签: regex sparql rdf jena linked-data