用空格分隔的正则表达式解析字符串和数字

时间:2018-03-26 08:54:49

标签: regex database oracle oracle11g

我有一个包含货币和价值的列。基本变体是PPM interactive shell (11.11_03) - type 'help' for available commands. PPM> install DateTime Install package 'DateTime?' (y/N): y Installing package 'DateTime'... Error installing package 'DateTime': Could not locate a PPD file for package DateTime PPM> 我必须将值和货币分隔到不同的列。

在某些情况下,其中一个不存在,因此字符串看起来像'USD 100000000.00' - 从' 100000000.00'space开始 - 以'USD '结束。

作品正确:

space

空val:

SELECT to_number(regexp_substr('USD ','[^ ]+', 1, 2)) as val from dual;

空val也是(正确):

SELECT to_number(regexp_substr(' 100000000','[^ ]+', 1, 2)) as val from dual;

如何为此案例SELECT to_number(regexp_substr('USD 100000000.00','[^ ]+', 1, 2)) as val from dual; 获取数值?

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式^(\S*)\s+(\S*)$来匹配:

  • 字符串的开头;然后
  • 零或多个非空白字符;然后
  • 一个或多个空格字符;然后
  • 零或多个非空白字符;然后
  • 字符串结尾

然后分别提取第一和第二个捕获组作为货币和金额:

SELECT REGEXP_SUBSTR(
         your_currency_string,
         '^(\S*)\s*(\S*)$',
         1,
         1,
         NULL,
         1                          -- 1st capture group
       ) AS currency,
       TO_NUMBER(
         REGEXP_SUBSTR(
           your_currency_string,
           '^(\S*)\s*(\S*)$',
           1,
           1,
           NULL,
           2                          -- 2nd capture group
         )
       ) AS amount
FROM   your_table

如果您想对正则表达式进行更严格的限制,那么您可以使用:

^(\S*)\s+(([1-9]\d*|0)?\.?\d{0,2})$

哪个匹配数字,可选,最多2个小数位,并且整数部分没有前导零(即01000,但00和{{1}不是 - 但如果你不想要这个限制,你可以使用01000

您也可以匹配字符串的开头和结尾:

(\d*\.?\d{0,2})$