【问题标题】:Using a regular expression to match everything after a colon使用正则表达式匹配冒号后的所有内容
【发布时间】:2011-10-27 14:47:55
【问题描述】:

我有一个这样的字符串:

192.168.114.182:SomethingFun-1083:EOL/Nothing Here : MySQL 数据库 4.12 192.168.15.82:SomethingElse-1325083:所有类型:PHP 版本信息: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

【问题讨论】:

标签: regex oracle plsql


【解决方案1】:

这应该可行:

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

【讨论】:

  • 可能想去掉斜杠,因为它是 Oracle 正则表达式。
  • 似乎这应该可行,但我仍然会像整行匹配一样返回整行。 REGEXP_SUBSTR(Title,'^[^:]+:[^:]+:(.*)\$') as Title, --using a slash in front of $ because of Perl
  • 我将我正在使用的实际数据放在一个正则表达式解析器中,这个正则表达式为我提供了我需要的数据。看起来我的 Oracle 语句返回整行而不是匹配的内容可能有问题。
  • 感谢您的帮助,我必须修复我这边的语法错误才能使正则表达式正常工作。
  • 我不认为 REGEXP_SUBSTR 的工作方式与直觉上看起来应该一样。 REGEXP_REPLACE 做到了 - 请参阅@bpgergo 的答案。
【解决方案2】:

REGEXP_REPLACE怎么样

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

【讨论】:

  • 我是 Oracle 新手,不知道这个功能,效果很好。谢谢!
【解决方案3】:

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

基准测试留给读者作为练习。

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2018-07-18
    • 2011-04-13
    相关资源
    最近更新 更多