Regexp_replace OF 前后的单独单词,不包括 OFF

Posted

技术标签:

【中文标题】Regexp_replace OF 前后的单独单词,不包括 OFF【英文标题】:Regexp_replace separate words before and after OF excluding OFF 【发布时间】:2013-04-25 22:34:24 【问题描述】:

我有一个字符串,我需要在 OF 之前和之后的单词之间设置空格。但是如果它最后是 OFF,那么它应该保持原样。请纠正我的表达方式或者如果有更好的书写方式。

PRINCEOFPERSIA ==> PRINCE OF PERSIA
PRINCOFFINLAND ==> PRINCE OF FINLAND
Blowoff ==> Blowoff
Spinoff ==> spinoff

I have written this exp.
Select REGEXP_REPLACE(spinoff,'(\w*)(off?)(.*)$','\1 \2 \3') from dual;
but it breaks it as 'spin off'

【问题讨论】:

【参考方案1】:

这看起来像你想要的 - 仅当 of 之后至少有 1 个字符而不是 f 时才替换:

 REGEXP_REPLACE(spinoff, '(\w+)(of)(f*[^f].*)$', '\1 \2 \3')

【讨论】:

酷!!!这很漂亮!!!是的,它现在工作得很好......它又处理了一个案例OFFTRACK ==> OFFTRACK ..哇好..好极了!你们俩(BTOUEG)都是天才 嗯,它在 regextester 上对我不起作用,但还不明白为什么 什么是regextester?还有我如何获得更多的专业知识..是否有一些工具可以提供帮助或者它只是纯粹的逻辑思维.. 非常感谢你们俩..我要回家了..现在是晚上 7 点 30 点..再次感谢 @deathApril 先生您好,我还有一个问题,如果有两个像 BLOWOFF DVD 这样的词,那么正则表达式不起作用【参考方案2】:

下面的正则表达式要么匹配句尾的“off”,要么匹配任何地方的“of”。

Select REGEXP_REPLACE(spinoff,'(off$)|(of)','\1 \2 ') form dual;

如果单词以“of”结尾,则此替代方法会尝试确保不添加尾随空格:

Select REGEXP_REPLACE(spinoff,'(off$)|(of)([^$])','\1 \2 \3') form dual;

【讨论】:

我有 Oracle 11g R1。我不认为!是正则表达式的一部分 在 oracle SQL(或其他基于 POSIX 的正则表达式实现)中没有环顾四周,我很害怕 太糟糕了,我们再找一个解决办法 是的,它不符合其他标准..PRINCEOFPERSIA.Also 如果它的 PRINCEOFFALKLAND 它应该成为福克兰王子 我对前后的空格没问题,我会在最后修剪它。

以上是关于Regexp_replace OF 前后的单独单词,不包括 OFF的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 regexp_replace 时每个字符前后都有空格?

如何在 Oracle 中使用 REGEXP_REPLACE 删除单词

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

想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE

RegExp_Replace Oracle 中某个单词列表之后的所有内容

从 postgres 表列中删除括号,但在其中保留单词