如何在XPATH中提取与模式匹配的文本?

时间:2012-08-01 20:31:42

标签: regex xpath pattern-matching

我的数据如下:

<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()函数...但只返回true或false。如果我想要匹配的字符串,那就不好了。我已经四处寻找,但找不到这个问题的满意答案,这可能很常见。

谢谢!

4 个答案:

答案 0 :(得分:7)

除了Michael Kay的好答案之外,如果您只想使用replace()功能,请使用

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

结果是

@FBst0451145
@FBst0451146

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

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

生成

 0451145 0451146

答案 1 :(得分:2)

尝试

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

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

答案 2 :(得分:1)

我假设您也可以使用XQuery。 get_matches()模块中的FunctX函数应该适合您。 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')

答案 3 :(得分:0)

在Dimitre的帮助下,正常工作的正则表达式是:

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

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

谢谢大家!