如何创建条件 RegEx 来检查产品输入?
How to create a conditional RegEx to check product input?
我想编写一个简单的正则表达式来验证用户输入的产品代码。
此产品代码有一些需要遵守的规则如下:
- 1组:(S)
- 2组:(B|S|T|M)
- 3组:(20)
- 4组:(-)
- 5组:(0|1) -> 当组号 2 为选项 T 或 M 时,选项“1”有效,对于 B 和 S 应为 '0'
为了匹配这些条件,我创建了这个正则表达式:
(S)([B|S|T|M])(20)(-)([0|1])
待测输入:
- SS20-0 => 正常
- SS20-1 => 挪威克朗
- ST20-0 => 正常
- ST20-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|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]))
我想编写一个简单的正则表达式来验证用户输入的产品代码。
此产品代码有一些需要遵守的规则如下:
- 1组:(S)
- 2组:(B|S|T|M)
- 3组:(20)
- 4组:(-)
- 5组:(0|1) -> 当组号 2 为选项 T 或 M 时,选项“1”有效,对于 B 和 S 应为 '0'
为了匹配这些条件,我创建了这个正则表达式:
(S)([B|S|T|M])(20)(-)([0|1])
待测输入:
- SS20-0 => 正常
- SS20-1 => 挪威克朗
- ST20-0 => 正常
- ST20-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|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]))