0

我有一个字符串 'TICKER: IBM IBM Corporation Inc.' 我想删除代码和它的值,并只获取 Oracle PL/SQL 中的剩余部分。

所以我做了这个查询,但它没有按照我的预期工作:

SELECT REGEXP_REPLACE(
           'TICKER: IBM IBM Corporation Inc.',
           '(.*):[[:space:]](.*)[[:space:]](.*)', '\3')
      FROM dual;

我希望 '\3' 会产生我的 'IBM Corporation 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.

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

谢谢。

4

2 回答 2

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;
于 2016-05-05T18:36:35.847 回答
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;
于 2016-05-05T19:00:41.233 回答