regex - 如何使用正则表达式提取子字符串?

标签 regex sparql

我确实在这样的查询中遇到过字符串

o = 'some interesting {foo123:bar_675:get_me.xyz} string'

我想从大括号内的部分中提取最后一个冒号之后的部分,所以在这种情况下 get_me.xyz

我知道正则表达式 \{.*:(.*)\} 可以工作(在 Python 中测试):

import re

o = 'some interesting {foo123:bar_675:get_me.xyz} string'
re.findall('\{.*:(.*)\}', o)

会回来

['get_me.xyz']

现在如何在查询中使用此正则表达式?

我试过了

SELECT (regex(?o, "\{.*:(.*)\}") as ?substring) ?o  
WHERE { 
  ?s ?p ?o .   
}

但这总是会引发错误

Parse error on line 6:
...SELECT (regex(?o, "\{.*:(.*)\}") as ?
---------------------^
Expecting 'IRIREF', 'PNAME_NS', 'VAR', '(', 'INTEGER', '!', '-', 'FUNC_ARITY0', 'FUNC_ARITY1', 'FUNC_ARITY2', 'IF', 'BOUND', 'BNODE', 'EXISTS', 'COUNT', 'FUNC_AGGREGATE', 'GROUP_CONCAT', 'DECIMAL', 'DOUBLE', 'true', 'false', 'STRING_LITERAL1', 'STRING_LITERAL2', 'STRING_LITERAL_LONG1', 'STRING_LITERAL_LONG2', 'INTEGER_POSITIVE', 'DECIMAL_POSITIVE', 'DOUBLE_POSITIVE', 'INTEGER_NEGATIVE', 'DECIMAL_NEGATIVE', 'DOUBLE_NEGATIVE', 'PNAME_LN', '+', 'NOT', 'CONCAT', 'COALESCE', 'SUBSTR', 'REGEX', 'REPLACE', got 'INVALID'

最佳答案

REGEX是过滤测试,REPLACE是抽取操作。

SELECT *
WHERE { 
  ?s ?p ?o .   
  FILTER REGEX(?o, "\\{.*:(.*)\\}")
}

它测试 ?o,并且不提取 () 部分。

注意双 \\

要提取使用 BIND-REPLACE。

SELECT * {
  ?s ?p ?o .   
  BIND(REPLACE(?o, "^.*\\{.*:(.*)\\}.*$", "$1") AS ?substring)
}

在一般情况下,您可能需要 str(?o) 而不是函数中的 ?o

关于regex - 如何使用正则表达式提取子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652831/

相关文章:

java - IP 和字符串的正则表达式

web - SPARQL查询中的评论?

sparql - 在 graphdb repo 中为多个数据集使用上下文

sparql - 星关系执行限制怎么解决

javascript - 使用匹配多个字符的正则表达式拆分字符串

regex - 使用补码运算形式化正则表达式

php - 在 url 中添加/更新参数

java - 正则表达式捕获具有特定容器的一系列数字

sparql - 将空白节点从 stardog 映射到 pubby

SPARQL:如果第一个选项不可用,如何获取可用语言的标签