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

Regex 使用用空格分隔的正则表达式分析字符串和数字,regex,database,oracle,oracle11g,Regex,Database,Oracle,Oracle11g,我有一个包含货币和价值的列。基本变量是“USD 100000000.00”我必须将值和货币分隔到不同的列中 在某些情况下,其中一个不存在,因此字符串看起来像'100000000.00'-以空格开始或'USD'-以空格结束 工作正确: SELECT to_number(regexp_substr('USD ','[^ ]+', 1, 2)) as val from dual; 空val: SELECT to_number(regexp_substr(' 100000000','[^ ]+', 1

我有一个包含货币和价值的列。基本变量是“USD 100000000.00”我必须将值和货币分隔到不同的列中

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

工作正确:

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;
空val(正确):


如何获取这种情况下的数值
'100000000'

您可以使用正则表达式
^(\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位小数且整数部分无前导零的数字(即允许使用
0
1000
,但
00
01000
不允许,但如果不需要此限制,您可以使用
(\d*\?\d{0,2})$

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

SELECT REGEXP_SUBSTR( your_currency_string, '^(\S*)' ) AS currency,
       TO_NUMBER( REGEXP_SUBSTR( your_currency_string, '(\S*)$' ) ) AS amount
FROM   your_table

也许你只需要匹配最后一个非空白块<代码>从dual中选择作为val的数字(regexp\u substr('100000000','[^]+$)
?如果您还需要预先验证输入,请尝试
regexp\u substr('USD 100000000','^(USD)?\s*(\d*\?\d+$),1,1,NULL,2)
SELECT REGEXP_SUBSTR( your_currency_string, '^(\S*)' ) AS currency,
       TO_NUMBER( REGEXP_SUBSTR( your_currency_string, '(\S*)$' ) ) AS amount
FROM   your_table