[英]Title Case Conversion in SPARQL Query with REGEX
我距离我的问题的解决方案只有一英寸的距离。 我正在尝试对通过 SPARQL 检索到的字符串进行标题大小写转换。 我将 REPLACE function 与 LCASE 和 REGEX 结合使用:
BIND (replace(lcase(?label), "(\\b[az](?,\\s))"? ucase("$1") ) as ?title_case)
lcase(?label)
: 字符串中的所有字符变为小写
(\\b[az](?!\\s))
:匹配字符串中每个单词的首字母
ucase($1)
: 是对匹配的第一个字母的反向引用,在将其转换为大写后充当替换。
预期结果: animal husbandry methods
变成Animal Husbandry Methods
由于我无法理解的原因,该解决方案几乎是正确的,但并不完全正确; 在这里查看工作中的示例。
当您运行查询时,您不会注意到?title_case
中有任何不同,但是如果您编辑ucase("$1")
为ucase("aaa")
您会看到它神奇地正确替换了每个单词的第一个字母:
结果: animal husbandry methods
变成AAAnimal AAAusbandry AAAethods
在我看来,UCASE function 对反向引用$1
没有任何影响
谁能向我解释为什么会这样,以及如何纠正这种行为?
SPARQL 中的 Function 调用遵循大多数编程语言的传统约定,即首先计算内部函数,然后将它们的返回值作为 arguments 提供给外部 ZC1C425268E68385D1AB5074C17A94F14。 这里的replace
需要 3 个字符串,输入字符串、模式和替换。 ucase
独立于结果的使用方式进行解释,它只是将其参数转换为大写,令人惊讶的是, $1
的大写是$1
!
在其他语言中,您通常会使用 function 的一些重载,它接受函数/表达式而不是字符串作为替换,以便您可以从内部调用任何内容。 这在 SPARQL 中是不可能的,所有replace
function 可以做的就是插入未修改的捕获。
恐怕您想要做的事情仅在 SPARQL 中无法完全实现。 您的选择是:
[az]
,因此您可以简单地展开所有字母并逐个替换它们: replace(replace(lcase(?label), "(\\ba(?,\\s))", "A" )? "(\\bb(,!\\s))", "B" )
等等。 不是一个非常优雅或高性能的解决方案,但它可以完成工作。^(.*?)(\b[az](?.\s))(.*)$
之类的模式将字符串拆分为 3 部分,您可以将其提取为替换为$1
,分别$2
和$3
。 将第一部分与第二部分的大写连接起来,然后对最后一部分重复整个过程。 您将不得不再次重复这些模式,但这次是相同的模式,因此有优化的潜力。 一个缺点是你必须在某个地方结束这个“递归”,所以你只能替换固定数量的单词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.