多个单词

时间:2016-05-05 18:29:19

标签: oracle regexp-replace

我有一个字符串' 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.

我在正则表达式中缺少什么?

感谢。

2 个答案:

答案 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;