【问题标题】:How do you extract text matching a pattern in XPATH?如何提取与 XPATH 中的模式匹配的文本?
【发布时间】:2012-08-01 20:31:42
【问题描述】:

我的数据如下所示:

<value>v13772   @FBst0451145:w&lt;up&gt;1118&lt;/up&gt;; P{GD3649}v13772@
v13773  @FBst0451146:w&lt;up&gt;1118&lt;/up&gt;; P{GD3649}v13773@</value>

如何在 XPATH 中处理此字符串以提取任何和所有 @FBst####### 数字?

我知道 xpath 的matches() 函数……但它只返回真或假。如果我想要匹配的字符串,那就不好了。我四处搜索,但找不到这个问题的令人满意的答案,这可能很常见。

谢谢!

【问题讨论】:

    标签: regex xpath pattern-matching


    【解决方案1】:

    除了 Michael Kay 的好回答,如果你只想使用 replace() 函数,那么使用

    replace(.,'.*?(@FBst\d+).*','$1')
    

    结果是

    @FBst0451145
    @FBst0451146
    

    如果您只想要上述结果中的数字,请使用

    replace(replace(.,'.*?(@FBst\d+).*','$1'),
              '[^0-9]+', ' ')
    

    这会产生

     0451145 0451146
    

    【讨论】:

    • 谢谢!但你的解决方案给了我 FBst0451145:w<up>1118</up>; P{GD3649}v13772@FBst0451146。我使用 replace(.,'.*?(@FBst\d+).*','$1 ','m') 解决了这个问题,谢谢!
    • 上下文节点不同。它实际上是来自 xquery 查询的 data($y/value)。我将其解释为“。”为简单起见。
    • 新的 sn-p 效果很好!我能问为什么嵌套的括号集吗? replace(.,'.*?(@FBst\d+).*','$1') 似乎可以正常工作
    • @JD,你说得对——当我得到这个解决方案时,我正在使用更复杂的 RegEx——这就是最外面的括号保留在那里的方式。现在在我的答案中替换为更简单的正则表达式。
    【解决方案2】:

    我假设您也可以使用 XQuery。 FunctX 模块中的 get_matches() 函数应该适合您。 Download 支持您的 XQuery 版本的文件。然后在您需要其功能时导入该模块。

    import module namespace functx = "http://www.functx.com" at "functx-1.0-doc-2007-01.xq";
    
    functx:get-matches(string-join(//text()),'xyz')
    

    【讨论】:

    • 有趣.. 我以前从未听说过这个。这个问题通常是这样解决的吗?
    • 我不确定为什么默认情况下 XPath/XQuery 中没有此类功能,但 FunctX 添加了很多很棒的功能。我猜是因为 XPath/XQuery 经常在另一个上下文中使用(例如,从另一种编程语言中调用),所以一些功能预计已经存在。
    • 感谢西科!我查看了他们的网站,找不到任何关于如何应用这些库的说明。你介意这样扔骨头吗? :)
    • 您是否下载了download page 上的文件之一?
    【解决方案3】:

    试试

    tokenize(value, '[^0-9]+')
    

    它应该返回由非数字序列分隔的标记序列。

    【讨论】:

    • 谢谢迈克尔!此处未显示,但这是许多 元素之一,其他元素具有其他数字,此解决方案未涵盖这些元素。我正在寻找 !'FBst[^0-9]+' 一种正则表达式,仅提取 FBst 值。我不确定这种模式在这种情况下是否可行。干杯!
    【解决方案4】:

    在 Dimitre 的帮助下,一个有效的正则表达式是:

    replace(.,'.*?(@FBst\d+).*','$1 ','m')
    

    虽然除非换行符分隔每个目标字符串,否则它不起作用,但现在可以。

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2021-04-13
      • 2012-10-17
      • 1970-01-01
      • 2011-09-18
      • 2013-06-09
      相关资源
      最近更新 更多