SQL函数REGEXP_SUBSTR:正则表达式如何获取两个字符之间的内容但不包括它们

时间:2012-11-15 00:41:07

标签: sql regex oracle

对于这些字符串

   RSLR_AIRL19_ID3454_T20030913091226
   RSLR_AIRL19_ID3122454_T20030913091226
   RSLR_AIRL19_ID34_T20030913091226

如何获取ID后的号码?

或者如何获取两个字符之间的内容但不包括它们?

我使用此'/\_ID([^_]+)/'得到的匹配数组([0] => _ID3454 [1] => 3454)

这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

& 引擎:

ID\K\w+

注意

\K“重启”比赛。

请参阅http://www.phpfreaks.com/blog/pcre-regex-spotlight-kphp使用pcre

答案 1 :(得分:0)

要在ID之后提取数字,您可以编写类似的查询。

SQL> with t1 as(
  2    select 'RSLR_AIRL19_ID3454_T20030913091226' as col from dual union all
  3    select 'RSLR_AIRL19_ID3122454_T20030913091226'     from dual union all
  4    select 'RSLR_AIRL19_ID34_T20030913091226'          from dual
  5  )
  6  select regexp_substr(col, '^([[:alnum:]]+_){2}ID([[:digit:]]+)_([[:alnum:]]+){1}$', 1, 1, 'i', 2) as ID
  7    from t1
  8  ;

ID
-------------
3454
3122454
34

或者,如果您想从第一次出现的模式中提取数字而不验证整个字符串是否与特定格式匹配:

SQL> with t1 as(
  2    select 'RSLR_AI_RL19_ID3454_T20030913091226' as col from dual union all
  3    select 'RSLR_AIRL19_ID3122454_T20030913091226'      from dual union all
  4    select 'RSLR_AIRL19_ID34_T20030913091226'           from dual
  5  )
  6  select regexp_substr(col, 'ID([[:digit:]]+)', 1, 1, 'i', 1) as ID
  7    from t1
  8  ;

ID
--------------
3454
3122454
34