Regex 使用用空格分隔的正则表达式分析字符串和数字
我有一个包含货币和价值的列。基本变量是“USD 100000000.00”我必须将值和货币分隔到不同的列中 在某些情况下,其中一个不存在,因此字符串看起来像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
'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