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
(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]
的作用。这表示“匹配a0
、a|
或a1
”。我相信你希望它说“匹配a0
或a1
”。在这种情况下,您需要[01]
或(?:0 | 1)
。
(S)(?:(B|S)|(T|M))(20)(-)((?(2)0|[0|1]))