Regex 如何创建条件正则表达式来检查产品输入?

Regex 如何创建条件正则表达式来检查产品输入?,regex,regex-group,Regex,Regex Group,我想编写一个简单的正则表达式来验证作为用户输入的产品代码 本产品代码有一些需要遵守的规则,如下所示: 1组:(S) 2组:(B | S | T | M) 第三组:(20) 4组:() 5组:(0 | 1)->当组号2为选项T或M时,选项“1”有效,因为B和S应为“0” 为了满足这些条件,我创建了以下正则表达式: (S)([B|S|T|M])(20)(-)([0|1]) 要测试的输入: SS20-0=>OK SS20-1=>NOK ST20-0=>OK ST20-1=>OK 很好,部分有

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

本产品代码有一些需要遵守的规则,如下所示:

  • 1组:(S)
  • 2组:(B | S | T | M)
  • 第三组:(20)
  • 4组:()
  • 5组:(0 | 1)->当组号2为选项T或M时,选项“1”有效,因为B和S应为“0”
为了满足这些条件,我创建了以下正则表达式:

(S)([B|S|T|M])(20)(-)([0|1])
要测试的输入:

  • SS20-0=>OK
  • SS20-1=>NOK
  • ST20-0=>OK
  • ST20-1=>OK
很好,部分有效,但我如何在第5组中创建一个特殊条件来检查这些规则?

X15_灯

给你:

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

条件组结构如下所示:

(?(1)Pattern1|Pattern2)

其中(1)是对组的引用。如果组1返回匹配,则匹配模式1,否则匹配模式2。

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


首先,你的OR ing不像你想象的那样工作。当您将内容放在方括号内时,它会将其转换为字符类,这意味着管道字符
|
仅表示文字管道,而不是OR。要解决此问题,请去掉方括号。现在,回答你的问题:

因为只有两个可能的条件,所以可以将它们作为两个单独的分支写出,如下所示:

(S)(B | S)(20)(0)(S)(T | M)(20)(1)
或者,您可以将
B|S
T|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]))

当组号2为选项T或M时,您说选项“1”有效,但
ST20-0
正常吗?根据您的逻辑,这不应该是无效的吗?因为它不是选项0?组2将驱动组5:如果组2是s或B,则组5应为0如果组2是t或M,则组5应为0或1以任何方式创建正则表达式来检查这些条件?试着运行
ST20-|
并查看发生了什么。我认为你不明白
[0 | 1]
的作用。这表示“匹配a
0
、a
|
或a
1
”。我相信你希望它说“匹配a
0
或a
1
”。在这种情况下,您需要
[01]
(?:0 | 1)
(S)(?:(B|S)|(T|M))(20)(-)((?(2)0|[0|1]))