【问题标题】:Oracle SQL - Regular Expression matching using REGEXP_REPLACE()Oracle SQL - 使用 REGEXP_REPLACE() 进行正则表达式匹配
【发布时间】:2018-07-19 01:41:52
【问题描述】:

早上好,

我希望在编写选择查询以从列中删除一些文本时寻求帮助。

我在之前的查询中创建了一个名为“TEXT_MINING”的列,其他开发人员编写的一些代码将对其执行一些文本挖掘分析。 TEXT_MINING 列的文本如下所示:

员工发现锤子上的手柄破损 * 02-08-18 下午 15:19:22 * 我发现了一把锤子,手柄上的木头裂开,被扔成废料。

我想删除 * 和两个 * 之间的所有文本,以帮助我的软件工程师进行一些文本挖掘。这是我目前的困境:

我不仅不知道如何使用 REGEXP_REPLACE,而且我无法解决 REGEXP。我目前有:

^[*]\w[*]$

所以它看起来像:

REGEXP_REPLACE(col, '^[*]\w[*]$', '')

谁能给点建议?

谢谢!

【问题讨论】:

  • 我不明白为什么“文本挖掘”不能处理原始列,但那是完全不同的事情。
  • @GordonLinoff 你说的完全正确......但我只是想按照我说的去做
  • 字符串可以有多个*s吗?
  • 从来没有,至少我从来没有见过@GordonLinoff。但是,我认为以下解决方案有效!

标签: sql regex oracle regexp-replace


【解决方案1】:

您可以使用此方法删除列中出现 1 次以上的 *...* 子字符串:

SELECT REGEXP_REPLACE(
   'EMPLOYEE FOUND BROKEN HANDLE ON HAMMER * 02-08-18 15:19:22 PM * I found a hammer that had the wood split on the handle, tossed into scrap.', 
   '\s*\*[^*]*\*', 
   ''
) as Result from dual

online demo

模式详情

  • \s* - 0+ 个空格
  • \* - 一个 * 字符
  • [^*]* - 除了* 之外的 0+ 个字符
  • \* - 一个 * 字符。

请参阅regex demo

【讨论】:

  • 非常感谢您的解释和解释!这太棒了!
  • 这是一个更安全的解决方案,因为它停在下一个 * 而不是最后一个。
  • Wiktor,这太棒了,我将继续前进。我也感谢您花时间为我分解“模式细节”。我在这方面学到了很多东西,并感谢您的时间。
  • @bm0r3son 请注意,* 是一个特殊的字符(运算符,称为量词),表示它修改的模式 0 次或多次出现),因此您需要转义它以匹配文字 * 字符(如 "\*"),如果它在字符集、括号表达式内,则不必转义它("[*]")。
【解决方案2】:

这可能是一种方式:

select regexp_replace(yourString, '\*.*\*', '') from yourTable

请注意,这将删除字符串中第一个和最后一个 '*' 之间的所有内容;例如:

with test(x) as (
select 'Something * something else * and a * just before another * and something more' from dual
)
select regexp_replace(x, '\*.*\*', '') from test

给予:

Something  and something more

【讨论】:

  • 我采用了这种方法,效果很好。它简单有效。使用上面的 Wiktor 的正则表达式会更好吗?这种方法对我来说非常有效。谢谢!
  • @bm0r3son 这个\*.*\* 将使Hi 脱离Hi *Tom*, have you met *Jim?*,因为.* 匹配到最后一个*
  • @bm0r3son:这两个表达式做不同的事情,只取决于最适合您的需要
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多