如何使用 REGEXP_REPLACE

Posted

技术标签:

【中文标题】如何使用 REGEXP_REPLACE【英文标题】:How to use REGEXP_REPLACE 【发布时间】:2019-07-02 15:06:47 【问题描述】:

我有如下这样的字符串/xml 标记。请看下面的代码...

<filterCriteriaRow>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value>503099</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value>503099</value>
  </filterCriteriaItem>
  <conjunction>AND</conjunction>
</filterCriteriaRow>

我想操纵那个字符串变成这样:

<filterCriteriaRow>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value2>503099</value2>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value2>503099</value2>
  </filterCriteriaItem>
  <conjunction>AND</conjunction>
</filterCriteriaRow>

如您所见,一个父标签中有一个双标签列“值” 我想创建第一个值标签成为“值”,但第二个值标签成为“value2”

如何使用 regexp_replace 操作该字符串?

请帮忙

【问题讨论】:

你用什么编程语言编写代码? Oracle PLSQL @AritroSen 'value' 标签总是在 'filterCriteriaItem' 标签内?它也可以有多次出现(我的意思是超过2次)? 是的,值标签始终在 filterCriteriaItem 标签中,并且值标签最多出现 2 个 @AritroSen Obligatory link 关于尝试使用正则表达式而不是使用 DOM 解析器来解析 [X]html 是徒劳的。 【参考方案1】:

Oracle 中有许多 XML 选项,其中许多在最近的版本中已被弃用。

当前的一个选项是使用 xquery 更新,以下示例假设您的 XML 位于存储为 XMLTYPE 的表中。

假设每个 'filterCriteriaItem' 有两个 'value' 节点...

SELECT XMLQUERY (
          'copy $copy := . 
           modify (
             for $fci in $copy/filterCriteriaRow/filterCriteriaItem/value[2]
                return rename node $fci as "value2")
           return $copy'
          PASSING xml_doc 
          RETURNING CONTENT) new_xml_doc
FROM   table_name;

或者更一般地说...

SELECT XMLQUERY (
         'copy $copy := . 
          modify (
            for $fci in $copy/filterCriteriaRow/filterCriteriaItem
               for $val at $pos in $fci/value
                  return rename node $val as 
                     fn:concat("value", if ($pos = 1) then "" else $pos))
          return $copy'
         PASSING xml_doc 
         RETURNING CONTENT) new_xml_doc
FROM   table_name;

【讨论】:

以上是关于如何使用 REGEXP_REPLACE的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中使用 regexp_replace() 一次删除多个字符?

如何在火花中使用 Regexp_replace

Sparklyr/Hive:如何正确使用正则表达式(regexp_replace)?

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)

如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换