【问题标题】:oracle sql regexp_replaceoracle sql regexp_replace
【发布时间】:2018-09-20 21:46:09
【问题描述】:

我有一个表,其中包含这样的值。

ExpTable

+--------+   
|expCol  | 
+--------+
|abc.abc |
|bcd.123 |
|efg.@/. |
+--------+

而我想要的是,当句号后面的字符是字母或数字时,输出会在点后面加一个空格,如下所示:

预期输出

+--------+   
|expCol  | 
+--------+
|abc. abc|
|bcd. 123|
|efg.@/. | --the value here stays the same because after the period is not a letter/number
+--------+

我试过了:

SELECT REGEXP_REPLACE(expCol, '.', '. ') from expTable WHERE /*condition*/

正如预期的那样,包括最后一个值“efg.@/.”在内的所有内容期后有空位。我不知道在 WHERE 子句中放什么。

【问题讨论】:

    标签: sql oracle oracle11g regexp-replace


    【解决方案1】:

    你可以试试这个。它搜索 . 后跟一个单词字符,并将其替换为一个点 .,然后是一个空格和匹配的字符。

    select REGEXP_REPLACE(expCol, '\.(\w)','. \1') FROM ExpTable;
    

    如果您只想替换第一个这样的匹配项,您可以指定它。

    REGEXP_REPLACE(expCol, '\.(\w)','. \1',1,1) 
    

    唯一需要注意的是,这将匹配数字、字母和下划线,如果您不想考虑 "_" ,请使用 [[:alnum:]][a-zA-Z0-9] 代替 \w

    Demo

    【讨论】:

      【解决方案2】:
      SELECT REGEXP_REPLACE(expCol, '\.([a-zA-Z0-9])', '. \1') AS expCol FROM expTable
      

      SELECT REGEXP_REPLACE(expCol, '[.]([a-zA-Z0-9])', '. \1') AS expCol FROM expTable
      

      输出

      EXPCOL
      abc. abc
      bcd. 123
      efg.@/.
      

      现场演示

      http://sqlfiddle.com/#!4/0a6e0/31

      【讨论】:

      • 这会将abc/123 更改为abc. 123,这是错误的。 SQLFIDDLE [/.] 将匹配 / 字符或 . 字符 - 你想要 [.]\. 代替。此外,您不想使用REGEXP_LIKE,然后在REGEXP_REPLACE 中使用不同的表达式,因为'abc.123.@/.' 将匹配REGEXP_LIKE,然后REGEXP_SUBSTR 将其更改为'abc. 123. @/. ',这又是错误的。
      • 抱歉输入错误
      • 仍然错误,因为 [\.] 将匹配 \ 和 . 字符 SQLFIDDLE。此外,编辑没有解决第二个错误。
      • 现在是正确的我认为@MT0 感谢不同的测试用例
      • 仍然错误,因为 [\.] 将匹配 \ 和 . 字符。 SQLFIDDLE - 查看输出最后一行的差异。您希望 '[.]([a-zA-Z0-9])''\.([a-zA-Z0-9])' 作为正则表达式。
      【解决方案3】:

      你可以试试这个。

      . 是正则表达式中的关键字,因此您需要将\ 放在它前面

      SELECT REGEXP_REPLACE(expCol, '\.(\w)', '. \1') from T
      

      sqlfiddle :http://sqlfiddle.com/#!4/94ffec/1

      【讨论】:

      • REGEXP_REPLACE(EXPCOL,'\.\W','.') abc. bc bcd. 23 efg.@/. 您的输出错误,它替换了. 之后的第一个字符
      • 你们是对的 :(。我编辑了我的答案。我很抱歉。
      猜你喜欢
      • 2016-06-13
      • 2014-05-28
      • 2018-06-23
      • 2019-09-02
      • 2016-08-31
      • 2018-10-07
      • 2018-04-23
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多