为W00001之类的模式编写正则表达式

时间:2014-04-22 16:13:32

标签: sql regex oracle

我是正则表达式的新手,非常感谢任何帮助。

  • 模式如W00000,W00001,W00002,W00004
  • 必须以W
  • 开头
  • 逗号前的每个字符串必须为六个字符
  • 字符串只能重复四次
  • 逗号介于
  • 之间
  • 不得以逗号开头或结尾

我尝试过以下模式和其他一些模式,例如(^[W]{1}\d{5}){1,4}'),但没有一个能正常工作:

Select 'X' from dual Where REGEXP_LIKE ('W12342','(^[W]{1}\d{5})(?<!,)$')

3 个答案:

答案 0 :(得分:2)

那么在这种情况下,你可以这样做:

(W[^,]{5},){3}W[^,]{5}

答案 1 :(得分:2)

我的理解是OP说如果字符串以逗号开头或结尾,匹配应该失败,而不仅仅是前面或后面的逗号不匹配,所以需要锚点。此外,基于他尝试的正则表达式,我推断单个组(例如W00000)应匹配。所以,如果 W 后面的字符必须始终为数字,我认为正则表达式应该是这样的:

^W[:digit:]{5}(,W[:digit:]{5}){0,3}$

或者,如果它们可以是数字以外的东西:

^W[^,]{5}(,W[^,]{5}){0,3}$

<强>更新

OP发布了以下评论:

  

我在Oracle 11g上,[:digit:]不起作用。当我用[0-9]替换它时,它可以正常工作。

根据the documentation,Oracle 11g符合POSIX正则表达式标准,而能够使用POSIX字符类,例如 [:digit:] 。但是,我在文档中注意到Oracle 11g确实支持Perl样式的反斜杠字符类缩写,当我最初编写这个答案时,我认为并非如此。在这种情况下,以下应该有效:

^W\d{5}(,W\d{5}){0,3}$

答案 2 :(得分:0)

如果我理解正确,应该这样做!

^W[0-9]{5}(,W[0-9]{5}){0,3}$

一个W12345模式,可能后跟一到三个,W12345块。

Edit1:如果有逗号,则添加^ $失败 Edit2:修复类,因为它在Oracle 11g上失败