繁体   English   中英

使用 REGEX 的 SPARQL 查询中的标题大小写转换

[英]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 中无法完全实现。 您的选择是:

  • 如果端点支持,请使用包含 function 的 SPARQL 扩展,这使得它成为可能。
  • 如果您的查询是较大管道的一部分,请以另一种方式转换结果,例如使用 XSLT。
  • 由于您只关心[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM