【问题标题】:REGEXP_LIKE to match xml tag content that is not like a specific stringREGEXP_LIKE 匹配与特定字符串不同的 xml 标记内容
【发布时间】:2017-06-14 08:29:16
【问题描述】:

我正在尝试做一个与 REGEXP_LIKE 匹配的正则表达式,并且我正在寻找一个正则表达式来查找特定标记的值是否不是特定字符串。 例如:

<person>
   <name>John</name>
   <age>40</age>
</person>

我的目标是验证名称标签的值不是 John,因此 REGEXP_LIKE 将为名称不是 John 的输入 xmls 返回 true。 提前感谢您的帮助!

【问题讨论】:

  • 这和PL/SQL 有什么关系?您是否将整个 XML 数据存储在数据库的单行中?
  • 是的,在这种情况下,我将整个 xml 数据存储在一行中。

标签: regex xml plsql


【解决方案1】:

一种快速简便的方法是简单地否定正则表达式搜索:

... WHERE NOT REGEXP_LIKE('column_name', '<name>John</name>')

但是,每次发布此类问题时都应该提到,通常是a bad idea to parse XML with regex。如果您发现自己正在构建更复杂的正则表达式模式来搜索这些 XML 数据,那么您应该:

  • 使用an XML parser 代替正则表达式,或者
  • 改变您存储数据的方式!将person.age 设为单独的表格列;不要将整个 XML 结构拼凑到一个地方。

【讨论】:

  • 我使用了您建议的相同解决方案,但是我很想找到一种方法来查看是否可以在正则表达式中完成否定。
  • 这很容易通过前瞻来完成,但我不知道PL/SQL 正则表达式是否支持这一点。类似于:&lt;name&gt;(?!John)[^&lt;]*&lt;/name&gt; ... 但正如我所说,使用正则表达式解析 XML 是自找麻烦。
  • 如果该语言不支持此正则表达式功能,那么您也可以使用更详细的模式来实现这一点:&lt;name&gt;([^J]|J[^o]|Jo[^h]|Joh[^n]|John[^&lt;])[^&lt;]*&lt;/name&gt;
  • 非常感谢!第一个解决方案 (?!John)[^ 就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2017-05-26
相关资源
最近更新 更多