没有空格的 Oracle 正则表达式

Posted

技术标签:

【中文标题】没有空格的 Oracle 正则表达式【英文标题】:Oracle regexp without white space 【发布时间】:2017-03-09 21:54:22 【问题描述】:

我需要在两个单词之间替换所有没有空格的地方,其中第一个以点结尾,这两个单词在它们之间带有空格。

例如,我有'num.some' 这样的字符串,我需要'num. some'

但是如果我有'num. some',我就不需要'num. some'

如果我有'123.4',我也不想要'123. 4' 如果我有'123.some',我需要'123. some'

我尝试了不同的正则表达式组合,但我的答案总是有问题。

【问题讨论】:

请发布您到目前为止尝试过的内容以及遇到的问题 你能在数据中有some.123吗,那还需要加空格吗? 【参考方案1】:

这样的事情可能会对你有所帮助:

WITH examples AS (
  SELECT 'num.some' str FROM dual
  UNION 
  SELECT 'num. some' str FROM dual
  UNION 
  SELECT '123.4' str FROM dual
  UNION 
  SELECT '123.some' str FROM dual
)
SELECT str, REGEXP_REPLACE(str,'([a-zA-Z0-9]+)\.([a-zA-Z]+)','\1. \2') replaced
FROM examples

这会在一个字母之后寻找一个点,然后是一个没有空格的字母

【讨论】:

第二个单词重复两次(后面的单词。)我有“dol.USA”,而这个是“dol.USA”。美国'我不明白为什么? @AnastasiaSisordia 它也为我和“dol.USA”一起工作【参考方案2】:

这会查找所有组合(letter.letter、letter.digit、digit.letter)并在 .同时保持 digit.digit 不变。

with
     inputs ( str ) as (
       select 'ab.sw'  from dual union all
       select 'ab. sw' from dual union all
       select '12.33'  from dual union all
       select '12. 33' from dual union all
       select 'ab.123' from dual union all
       select '1. ab'  from dual union all
       select '1.abc'  from dual
     )
-- END test data. Solution (SQL query) begins below this line.
select str, regexp_replace(str, 
          '(([[:alpha:]]\.)([[:alpha:]])|([[:alpha:]]\.)(\d)|(\d\.)([[:alpha:]]))',
          '\2\4\6 \3\5\7') as new_str
from   inputs
;


STR     NEW_STR
------  -------
ab.sw   ab. sw
ab. sw  ab. sw
12.33   12.33
12. 33  12. 33
ab.123  ab. 123
1. ab   1. ab
1.abc   1. abc

【讨论】:

【参考方案3】:

也许您不需要正则表达式。普通的replace() 可能对你有好处。

(关于@mathguy 的测试数据)

with
     inputs ( str ) as (
       select 'ab.sw'  from dual union all
       select 'ab. sw' from dual union all
       select '12.33'  from dual union all
       select '12. 33' from dual union all
       select 'ab.123' from dual union all
       select '1. ab'  from dual union all
       select '1.abc'  from dual
     )
-- END test data. Solution (SQL query) begins below this line.
select replace(
  replace(str, '.', '. ') -- replace all dots by dot+space
, '  '
, ' '
) -- replace all double spaces by a single space
from   inputs
;

【讨论】:

以上是关于没有空格的 Oracle 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 正则表达式 - 删除字符串中长度为 1 的字母标记之间的空格

求一条oracle的正则表达式

没有空格或特殊字符的正则表达式[关闭]

正则表达式没有空格

正则表达式表示空格或者换行

Oracle中如何用正则表达式检测某个字段是不是带有日文字符