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

Posted

技术标签:

【中文标题】为 W00001 之类的模式编写正则表达式【英文标题】:Write regex for pattern like W00001 【发布时间】:2014-04-22 16:13:32 【问题描述】:

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

W00000,W00001,W00002,W00004 等模式 必须以 W 开头 逗号前的每个字符串必须是六个字符 字符串只能重复四次 中间有逗号 不得以逗号开头或结尾

我尝试了以下模式和其他一些模式,比如(^[W]1\d5)1,4'),但它们都不能正常工作:

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

【问题讨论】:

我认为没有必要使用 [W]1 ...它可能只是 W 是的...使用带有单个字符的字符类是多余的,而使用 1 作为量词总是是多余的。 +1 看到一个新用户发布了他们自己尝试过的尝试,而不是仅仅说“给我一个这样的正则表达式!”太清爽了。 如果您的问题已得到充分回答,请mark the answer that you feel best addressed your question as accepted。获得至少 15 个代表后,您还可以 upvote 接受的答案以及您认为有用的任何其他答案。 @Walls 由于正则表达式的性质,我倾向于在此标签中使用更灵活的标准,以便在尝试解决问题方面从 OP 中看到我希望看到的内容,因为通常知道要做什么尝试就是知道如何去做(我见过其他人表达同样的观点);但我认为这个问题说明了无论如何展示尝试解决方案的价值:尝试的正则表达式帮助我理解了一些关于他想要完成的事情,而这些事情仅仅通过口头描述是不清楚的。 【参考方案1】:

我的理解是,如果字符串以逗号开头或结尾,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\d5(,W\d5)0,3$

【讨论】:

实际上,有一点需要澄清......我从问题中发布的尝试正则表达式推断出这种模式应该是 整个 字符串。如果您尝试匹配较大字符串中描述的模式,则应将锚点替换为负零长度断言。如果您正在尝试这样做,请告诉我。 Adi,您的假设是正确的..我已经对此进行了测试,这就是我想要的。尽管由于某种原因 [:digit:] 对我不起作用,我使用了 [0-9] 并且效果很好...您对 W 需要后跟 5 位数字的条件的假设是正确的..:) 谢谢你们大家..现在我知道一点正则表达式了。【参考方案2】:

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

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

【讨论】:

如果我正确理解问题,您的初始 W. 也应该是 W[^,] 从它的一种模式来看,我认为它可能是 1 到 4 个字符串块。您的表达式只会找到 4 个块的版本。 @JustinMorgan,是的。编辑后,问题清楚了。谢谢。 谢谢阿米特·乔基!!我忘了提到至少有一个 W12345 块,后面可能有三个,我在你的 RexEx 中添加了 1,3。当我在开头或结尾添加逗号时,它不起作用 Select 'X' from dual Where REGEXP_LIKE (',W12342,W12342,W12342,','(W[^,]5,)1,3 W[^,]5') 'W12342,W12342,W12342,W12342'- 工作 'W12342,W12342,W12342' - 工作 @user3561229 只是为了验证我是否理解正确:您在这里说“当我在开头或结尾添加逗号时,它不起作用”;我认为您的意思是它“不起作用”,因为如果您在开头或结尾添加逗号,则此正则表达式仍与字符串匹配(不包括前面和/或结尾的逗号),并且您希望它不在那种情况下完全匹配?【参考方案3】:

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

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

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

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

【讨论】:

感谢 Mat M.,我试过了,但它没有给出正确的输出,字符串为 'W12342,W12342,W12342,W12342'。此外,当我在开头或结尾添加逗号时,它也不起作用。从对偶中选择“X”,其中 REGEXP_LIKE ('W12342,W12342,W12342,W12342','(W[:digit:]5)(,W[:digit:]5)1,3') 三个问题:(1)我相信如果前面或后面有逗号,他希望匹配失败,而不仅仅是将它们排除在匹配之外。 (2) 我相信一组 W 加上六个字符(数字?)应该匹配,所以最后的量词应该是0,3。 (3) 不需要第一组括号。 @Adi: 1.& 2. 已修复 3. 同意。如果另一个编辑来了,将修复:) @user3561229:您使用哪个 Oracle 版本?你能试试W[:digit:]5,W[:digit:]5,W[:digit:]5,W[:digit:]5 工作的 4 块吗? Oracle 10g doc 表示数字类是合法的, 构造也是如此,所以它应该可以工作。也许其他地方有问题。 好的...虽然我已经发布了。我只是在解释为什么我认为您拥有的正则表达式不是 OP 正在寻找的。​​span>

以上是关于为 W00001 之类的模式编写正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 Python 模式 [重复]

多次匹配正则表达式模式

正则表达式考点

如何在 Pl/SQL 中编写正则表达式匹配模式?

正则表达式

Pandas - 使用模式/正则表达式编辑索引