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

4
我在查询中遇到了这样的字符串
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'
1个回答

7

正则表达式是一种过滤测试,替换是一种提取操作。

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

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

注意双\\

要提取,请使用BIND-REPLACE。

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

通常情况下,在函数中您可能需要使用str(?o)而不是?o


1
那差不多可以了。现在它似乎已经用所需的子字符串替换了花括号部分。因此,从我上面的例子中,它将返回:'some interesting get_me.xyz string'。但我只想要get_me.xyz部分。有什么想法吗? - Cleb
1
@Cleb,replace(?o, '^.*\\{.*:(.*)\\}.*$', "$1")?另请参阅https://www.w3.org/TR/xpath-functions/#regex-syntax。您还可以使用`STRBEFORE` + STRAFTER - Stanislav Kralin
@StanislavKralin:太好了,确实解决了问题。非常感谢! - Cleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接