什么是regexpression':[^:] +:[^:] +:[^:] + *'匹配

时间:2013-12-20 09:34:38

标签: regex oracle

substr( regexp_substr(data,':[^:]+:[^:]+:[^:]+*', 1, 1),
        length(regexp_substr(data,':[^:]+:[^:]+:*', 1, 1)) + 6
)

我无法访问data代表的reg_substr内容。当我试图检查一些任意(虚拟)数据时,我得到null作为结果。请解释一下reg表达式':[^:]+:[^:]+:[^:]+*'代表的例子。谢谢。

:在reg表达中的意义是什么。

4 个答案:

答案 0 :(得分:1)

科隆并不特别。这将匹配单个冒号,后跟任何不是冒号(多个字符),后跟冒号,然后是......

我不确定最后的星号是什么 - 我不认为它有任何影响(可能是一个错误)。

据我所知,此命令将返回6个格式的字符:a:b:c(表示':[^:]:[^:]:[^:]'将是等效的正则表达式)。

答案 1 :(得分:1)

我刚在在线正则表达式调试器上尝试过,您可以在此处查看结果http://regex101.com/r/vG5oV3以及正则表达式各部分的说明。

如果你在问题中使用正则表达式,结尾'+ *'没有任何意义,也不是正确的正则表达式(正如Liath在评论中提到的那样)

在[]之外的

:是表达式中匹配的字符,而[^:]+表示从一个字符到不受限制的字符匹配:

所以它首先找到第一个:然后匹配所有字符,直到找到另一个:然后再次这样做,共计三次。

答案 2 :(得分:1)

这是一个例子。第三列是一个等价的正则表达式,在我看来更短/更清楚:

SQL> with t as
  2  ( select 'abc:de:fghijk:lmnopqrs:tuvw:xyz' data from dual union all
  3    select 'abcde:fg:hi:jklmnopqr:s:tu:v:wxyz' from dual union all
  4    select ':abcde:fg:hi:jklmnopqr:s:tu:v:wxyz' from dual
  5  )
  6  select data
  7       , substr
  8         ( regexp_substr(data,':[^:]+:[^:]+:[^:]+*', 1, 1)
  9         , length(regexp_substr(data,':[^:]+:[^:]+:*', 1, 1)) + 6
 10         )
 11       , substr(regexp_substr(data,':[^:]+',1,3),7)
 12    from t
 13  /

DATA                               SUBSTR(REGEXP_SUBSTR(DATA,':[^:]+: SUBSTR(REGEXP_SUBSTR(DATA,':
---------------------------------- ---------------------------------- ----------------------------
abc:de:fghijk:lmnopqrs:tuvw:xyz    qrs                                qrs
abcde:fg:hi:jklmnopqr:s:tu:v:wxyz  opqr                               opqr
:abcde:fg:hi:jklmnopqr:s:tu:v:wxyz

3 rows selected.

的问候,
罗布。

答案 3 :(得分:1)

正则表达式:

:[^:]+:[^:]+:[^:]+*

匹配

  • 冒号:字符
  • 一个或多个不是冒号:
  • 的字符
  • 冒号:字符
  • 一个或多个不是冒号:
  • 的字符
  • 冒号:字符
  • 任何一个或多个字符不是冒号:,而是结尾的*意味着此前一个匹配[^:]+匹配零次或多次。< / LI>

[^:]+*有效,但没有多大的语义意义 - 相反,它可以重写为等效表达式[^:]*(零或多字符不是冒号:

SQL Fiddle

查询1

WITH strings AS (
            SELECT ':abcd:efg:hijk' AS string FROM DUAL
  UNION ALL SELECT 'test :1234:5:' FROM DUAL
  UNION ALL SELECT '::x:y::' FROM DUAL
)
SELECT string,
       REGEXP_SUBSTR( string, ':[^:]+:[^:]+:[^:]+*' ),
       REGEXP_SUBSTR( string, ':[^:]+:[^:]+:[^:]+' ),
       REGEXP_SUBSTR( string, ':[^:]+:[^:]+:[^:]*' )
FROM   strings

<强> Results

|         STRING | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]+*') | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]+') | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]*') |
|----------------|---------------------------------------------|--------------------------------------------|--------------------------------------------|
| :abcd:efg:hijk |                              :abcd:efg:hijk |                             :abcd:efg:hijk |                             :abcd:efg:hijk |
|  test :1234:5: |                                    :1234:5: |                                     (null) |                                   :1234:5: |
|        ::x:y:: |                                       :x:y: |                                     (null) |                                      :x:y: |