如何创建条件 RegEx 来检查产品输入?

How to create a conditional RegEx to check product input?

我想编写一个简单的正则表达式来验证用户输入的产品代码。

此产品代码有一些需要遵守的规则如下:

为了匹配这些条件,我创建了这个正则表达式:

(S)([B|S|T|M])(20)(-)([0|1])

待测输入:

很好,它部分起作用了,但是我如何在第 5 组中创建一个特殊条件来检查这些规则?

X15_Light,

给你:

(S)((B|S)|(T|M))(20)(-)(?(3)0|(0|1))

(Demo)

条件组结构如下所示:

(?(1)Pattern1|Pattern2)

其中 (1) 是对组的引用。如果第 1 组 returns 匹配,则匹配 Pattern1,否则匹配 Pattern2。

匹配第2组时,如果匹配到B或S,则向前看20-0确保最后的组为0:

https://regex101.com/r/VEhnHC/1

(S)([BS](?=20-0)|[TM])(20)(-)([01])

首先,您的 OR-ing 并不像您认为的那样工作。当你把东西放在方括号 [] 内时,它会变成一个字符 class,这意味着管道字符 | 只是一个文字管道,而不是一个 OR。要解决此问题,请去掉方括号。现在,回答你的问题:

因为你只有两个可能的条件,你可以把它们写成两个单独的分支,像这样:

(S)(B|S)(20)(-)(0)|(S)(T|M)(20)(-)(1)

或者,您可以将 B|ST|M 放在单独的捕获组中,然后您可以测试哪一个找到了匹配项。这更符合您对问题的描述,但似乎比必要的更复杂。请注意模式末尾的条件语法 (?(2)0|1)。这意味着如果捕获组 2 匹配某些内容,则只匹配模式 0。否则匹配模式 1。我们知道,如果捕获组 2 没有匹配到任何内容,则捕获组 3 必须 匹配某些内容,否则匹配将失败。

(S)(?:(B|S)|(T|M))(20)(-)((?(2)0|1))

我已经使用了下面的正则表达式,而且效果很好。

(S)(?:(B|S)|(T|M))(20)(-)((?(2)0|[0|1]))