当前位置: 首页 > 面试题库 >

匹配至少有一个单词的字符串

陆仲渊
2023-03-14
问题内容

我正在查询以获取具有特定标题的文档的URI。我的查询是:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?document WHERE {
  ?document dc:title ?title.
  FILTER (?title = "…" ).
}

"…"的值实际在哪里this.getTitle(),因为查询字符串是通过以下方式生成的:

String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
                "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?document WHERE { " +
                "?document dc:title ?title." +
                "FILTER (?title = \"" + this.getTitle() + "\" ). }";

通过上面的查询,我仅获得标题与完全相同的文档this.getTitle()。想象一下,this.getTitle是由多个词组成的。我想获得文档,即使this.getTitle文档标题上仅出现一个字形(例如)。我该怎么办?


问题答案:

假设您有一些数据(在Turtle中):

@prefix : <http://stackoverflow.com/q/20203733/1281433> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

:a dc:title "Great Gatsby" .
:b dc:title "Boring Gatsby" .
:c dc:title "Great Expectations" .
:d dc:title "The Great Muppet Caper" .

然后,您可以使用类似以下的查询:

prefix : <http://stackoverflow.com/q/20203733/1281433>
prefix dc: <http://purl.org/dc/elements/1.1/>

select ?x ?title where {
  # this is just in place of this.getTitle().  It provides a value for
  # ?TITLE that is "Gatsby Strikes Again".
  values ?TITLE { "Gatsby Strikes Again" }

  # Select a thing and its title.
  ?x dc:title ?title .

  # Then filter based on whether the ?title matches the result
  # of replacing the strings in ?TITLE with "|", and matching
  # case insensitively.
  filter( regex( ?title, replace( ?TITLE, " ", "|" ), "i" ))
}

得到像

------------------------
| x  | title           |
========================
| :b | "Boring Gatsby" |
| :a | "Great Gatsby"  |
------------------------

这样做特别整洁的是,由于您正在动态生成模式,因此甚至可以基于图形模式中的另一个值来进行创建。例如,如果您想要标题至少匹配一个单词的所有事物对,则可以执行以下操作:

prefix : <http://stackoverflow.com/q/20203733/1281433>
prefix dc: <http://purl.org/dc/elements/1.1/>

select ?x ?xtitle ?y ?ytitle where {
  ?x dc:title ?xtitle .
  ?y dc:title ?ytitle .
  filter( regex( ?xtitle, replace( ?ytitle, " ", "|" ), "i" ) && ?x != ?y )
}
order by ?x ?y

要得到:

-----------------------------------------------------------------
| x  | xtitle                   | y  | ytitle                   |
=================================================================
| :a | "Great Gatsby"           | :b | "Boring Gatsby"          |
| :a | "Great Gatsby"           | :c | "Great Expectations"     |
| :a | "Great Gatsby"           | :d | "The Great Muppet Caper" |
| :b | "Boring Gatsby"          | :a | "Great Gatsby"           |
| :c | "Great Expectations"     | :a | "Great Gatsby"           |
| :c | "Great Expectations"     | :d | "The Great Muppet Caper" |
| :d | "The Great Muppet Caper" | :a | "Great Gatsby"           |
| :d | "The Great Muppet Caper" | :c | "Great Expectations"     |
-----------------------------------------------------------------

当然, 非常 重要的一点是要注意,您现在正在根据数据提取生成模式,这意味着可以将数据放入系统中的人可能会使用非常昂贵的模式来阻止查询并导致拒绝-
服务。更为平凡的是,如果您的任何标题中包含会干扰正则表达式的字符,您都可能会遇到麻烦。一个有趣的问题是,如果某个东西的标题带有多个空格,则该模式变为The|Words|With||Two|Spaces,因为其中的空模式可能使
所有内容 匹配。这是一种有趣的方法,但是有 很多 警告。

通常,您可以如此处所示执行此操作,或者通过在代码中生成正则表达式(可以在其中转义等),或者可以使用支持某些基于文本的扩展名的SPARQL引擎(例如jena)
-text
,它将Apache
Lucene或Apache Solr添加到Apache Jena)。



 类似资料:
  • 基于正则表达式直到但不包括,我试图匹配所有字符,直到一个单词边界。 例如,在以下字符串中匹配: 我正在使用: 一个否定集 有字边界 和一个加号中继器 这样地: 它应该查找一个“a”,然后为任何非单词边界的字符获取一个或多个匹配项。所以我希望它在

  • 问题内容: 我想用php代替完整的单词 示例:如果我有 我用 新文本应如下所示 新hello1您好,Helloz PHP返回 NEW hello1 hello,NEWz 谢谢。 问题答案: 您要使用正则表达式。该单词边界匹配。 如果包含UTF-8文本,则必须添加Unicode修饰符“ u”,以便不会将非拉丁字符误解为单词边界:

  • 要匹配至少包含一个字母或数字的字符串,JavaScript正则表达式是什么?这至少需要一个字母数字字符(至少一个字母或至少一个数字)。

  • 问题内容: 我有一个正则表达式 这仅允许字母数字,但是如果我仅插入数字或字符,那么它也接受它。我希望它像字段应只接受字母数字值一样工作,但该值必须至少包含1个字符和1个数字。 问题答案: 为什么不先应用整个测试,然后再添加针对字符和数字的单独测试?无论如何,如果您想在一个正则表达式中完成所有操作,请使用正向提前:

  • 我有这样一个字符串: “#影响@John@Me Lorem ipsum door sit amet,奉献给精英们,让他们暂时参与劳动和生活。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,还必须因工作原因而受到伤害 我需要以两种方式“拆分”,删除第一个单词,因为它以“#”开头(我可以做/已经做过),第二个我想不出来-我需要从字符串

  • 我希望有一个用于密码匹配的regex,以确保密码包含: null 其他一些问题可以解决一些明确字母的脓肿问题。正如您在我接受的答案中所看到的,regex与我想要的并不接近。