我有一个字符串' TICKER:IBM IBM Corporation Inc.'我想删除自动收报机及其值,并抓住Oracle PL / SQL中的剩余部分。
所以我做了这个查询,但它没有按照我的意图工作:
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'(.*):[[:space:]](.*)[[:space:]](.*)', '\3')
FROM dual;
我希望' \ 3'会让我成为IBM公司。'但我得到的只是' Inc。'结果。
REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\3')
-----------------------------------------------------------------------------
Inc.
1 rows selected
更新
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'(.*):[[:space:]](.*)[[:space:]](.*)', '\1|\2|\3')
FROM dual;
结果:
REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\1|\2|\3')
--------------------------------------------------------------------------------
TICKER|IBM IBM Corporation|Inc.
我在正则表达式中缺少什么?
感谢。
答案 0 :(得分:2)
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'(.*):[[:space:]]([^ ]*)[[:space:]](.*)', '\3')
FROM dual;
你的第二个捕捉表达是抓住一切,包括下一个空间。
我应该提一下,我在Oracle中测试过,而不是PL / SQL。我认为虽然没有区别。
PS:以下替代方案也有效:
-- using only one capturing expression
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'.*: [^ ]* (.*)', '\1')
FROM dual;
-- using no capturing expressions
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'.*: [^ ]* ', '')
FROM dual;
答案 1 :(得分:1)
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM Corporation Inc.',
'^(.*?):\s(\S*)\s(.*)$',
'\3'
)
FROM DUAL;
或者,您的代码不需要进行太多更改就可以使其工作(将其锚定到字符串的开头并将前两个外卡匹配转换为非贪婪):
SELECT REGEXP_REPLACE(
'TICKER: IBM IBM: Corporation Inc.',
'^(.*?):[[:space:]](.*?)[[:space:]](.*)',
'\3'
)
FROM DUAL;