如何正确表达正则表达式?

时间:2011-10-07 07:32:28

标签: regex oracle plsql oracle10g

我需要从“*”的第三个位置获取数据到第四个。我这样做了:

    with t as (select 'T*76031*12558*test*received percents' as txt from dual)
         select regexp_replace(txt, '.*(.{4})[*][^*].*$', '\1')
    from t

我收到“测试” - 它是对的,但如何获得任意数量的字符,而不只是4?

4 个答案:

答案 0 :(得分:2)

根据您使用的示例,这应该有效:

REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')

所以SELECT将是:

WITH t 
  AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
  FROM t;

正则表达式寻找:

第1组: 字符串的开头。任意数量的字符,直到''。任何其他字符mto另一个''。任何其他字符,直到第三个'*'。

第2组: 任何字母数字字符

第3组: 一个'*'后跟任何其他字符,直到字符串的末尾。

将上述所有内容替换为第2组中的所有内容。

希望这有帮助。

编辑: 继Rob van Wijk在另一个主题的回答之后:

Exracting substring from given string

WITH t 
  AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_SUBSTR( txt,'[^\*]+',1,4)
  FROM t;

答案 1 :(得分:2)

以下情况如何?

 ^([^*]*[*]){3}([^*]*)

第一部分匹配3组*,第二部分匹配所有内容,直到下一行*或行结束。

答案 2 :(得分:1)

您假设文本的最后一个*也是第四个。如果这个假设是真的那么:

\b\w*\b(?=\*[^*]*$)

会得到你想要的东西。但当然这只匹配最后一颗星之前的*之间的最后一个字。它只匹配此情况下的测试或*。

中的任何单词字符

答案 3 :(得分:1)

注意: 10g REGEXP_SUBSTR不支持返回子表达式,请参阅下面的注释。

如果您真的只选择字符串的一部分,我建议使用REGEXP_SUBSTR。我不知道它是否更有效,但它会更好地记录你的意图:

SQL> select regexp_substr('T*76031*12558*test*received percents', 
                          '^([^*]*[*]){3}([^*]*)', 1, 1, '', 2) from dual;

REGEXP_SUBST
------------
test

上面我使用了Pieter-Bas提供的regexp。

另见http://www.regular-expressions.info/oracle.html