代码之家  ›  专栏  ›  技术社区  ›  Cleb

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

  •  1
  • Cleb  · 技术社区  · 6 年前

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

    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']
    

    如何在查询中使用这个regex?

    我试过

    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 回复  |  直到 6 年前
        1
  •  2
  •   Stanislav Kralin kenwenzel    6 年前

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

    ?o ()

    \\

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

    str(?o)