使用正则表达式匹配冒号后的所有内容

时间:2011-08-15 21:32:46

标签: regex oracle plsql

我有一个这样的字符串:

192.168.114.182:SomethingFun-1083:EOL/Nothing Here : MySQL Database 4.12
192.168.15.82:SomethingElse-1325083:All Types : PHP Version Info : 23

我正在尝试在Oracle数据库中选择此项(使用REGEXP_SUBSTR)并在第二个冒号(:)后获取所有剩余文本。

所以最后,我想得到这些价值观:

EOL/Nothing Here : MySQL Database 4.12
All Types : PHP Version Info : 23

我已经尝试过这些,但它找不到有用的东西。

REGEXP_SUBSTR(title,'[^:]+',1,3) as Title -- doesn't work if last field has ":"
REGEXP_SUBSTR(title,'(?:[^:]*:)+([^:]*)') as Title

3 个答案:

答案 0 :(得分:6)

REGEXP_REPLACE

怎么样?
REGEXP_REPLACE(title,'^[^:]+:[^:]+:(.*)$', '\1') as Title

答案 1 :(得分:4)

Oracle的正则表达式函数往往是CPU密集型而非替代品。 Tom Kyte的建议是“however, if you can do it without regular expressions - do it without them. regular expressions consume CPU hugely.

不使用正则表达式的替代方法是substr(test_values, instr(test_values, ':', 1, 2) + 1)

SQL> create table t (test_values varchar2(100));

Table created.

SQL> insert into t values ('192.168.114.182:SomethingFun-1083:EOL/Nothing Here : MySQL Database 4.12');

1 row created.

SQL> insert into t values ('192.168.15.82:SomethingElse-1325083:All Types : PHP Version Info : 23');

1 row created.

SQL> commit;

Commit complete.

SQL> select substr(test_values, instr(test_values, ':', 1, 2) + 1)
  2  from t;

SUBSTR(TEST_VALUES,INSTR(TEST_VALUES,':',1,2)+1)
-----------------------------------------------------
EOL/Nothing Here : MySQL Database 4.12
All Types : PHP Version Info : 23

基准标记留给读者练习。

答案 2 :(得分:1)

这应该有效:

^[^:]+:[^:]+:(.*)$