如何使用 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() 一次删除多个字符?
Sparklyr/Hive:如何正确使用正则表达式(regexp_replace)?
如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?