使用XQuery进行模式匹配

时间:2012-06-11 08:00:59

标签: regex xpath xquery

我有一个200MB大小的XML文档,其中包含文本信息。数据先前存储在包含2列的pagemaker文件中。标记后我发现某些文本有连字符。这是因为无法符合格式的单词被用连字符分隔的2个单词分解。此XML文档也使用连字符是另一个原因。分开短句(适用于笔记)。

我想找出这两个词之间的连字符。我注意到我想要找到删除的连字符有一个标准模式。例如。

第一次使用连字符 - (我想找到并替换)

questionques-tion answer将是ans-wer

连字符的其他用法是 - (未找到)

Pattern matchin - Regex Expressions - ...

因此两者的标准格式是 -

space-space

letter-letter

如何使用XQuery查找所有这些,即第二个...... 或者找到它们的任何其他方式......在巨大的XML文件中找到并替换它们......我的上帝......

2 个答案:

答案 0 :(得分:2)

200 MB并不大。 :)

如果你完全确定在tag- / attribute-names中找不到连字符,请使用sed(不鼓励!):

sed -E 's/([[:alpha:]]+)\-([[:alpha:]]+)/\1\2/g' doc.xml out.xml

更好地使用XQuery,因此您不必处理复杂的XML语法分析:

declare function local:copy-replace($element as element()) {  
  element {node-name($element)}  
          {$element/@*, 
        for $child in $element/node()  
        return
            if ($child instance of element())
            then local:copy-replace($child)  
            else replace($child, "(\w+)\-(\w+)","$1$2")
          }  
};

local:copy-replace(/*)

它还没有处理属性。如果在属性中出现带连字符的文本,则必须单独提取并包含它们。

有些学分转到some unknown user in this answer我很乐意记住这种模式。

答案 1 :(得分:-2)

XPath 2.0支持regular expression matching。调整this question的答案我会尝试XPath表达式,如:

//*[matches(.,'[a-zA-Z]-[a-zA-Z]')]

我使用Kernow实用程序测试了该表达式,版本1.7.2可用here

输入:

<list>
  <item>should not match - </item>
  <item>hel-lo</item>
  <item>wor-ld</item>
</list>

它返回了:

<?xml version="1.0" encoding="UTF-8"?>
<item>hel-lo</item>
<item>wor-ld</item>