通常我对我的正则表达能力非常满意,但我遇到了这个问题。我需要一种模式来验证DEA药物计划的变化。它看起来像这样:
22N 33N 4 5
1 2 3
22N-R 6
基本上最多可以有6个小组'被空间隔开。每个组可以有1或2个数字,后跟可选的N,然后是可选的-R。似乎还有其他一些限制(没有11组),但这并不是什么让我感到困扰。
我有这个:
^(1(-R)?)?\s?(2(-R)?)?(2N(-R)?)?\s?(3|3-R)?(3N|3N-R)?\s?(4(-R)?)?\s?(5(-R)?)?\s?(6(-R)?)?$
但问题是\ s?是可选的。那么这错误地传递: 22N33N45 如果我需要它们,那么我最终会得到前导或尾随空格。
所以,我认为我需要某种形式的外观,如果它被一个'组围绕,只有一个空间?
这是抓住,我需要用1个正则表达式做这个。我不能拆分空间然后正则表达部分,这太容易了!任何输入都会有所帮助!谢谢!
答案 0 :(得分:0)
想出这个正则表达式:
^(?:1(?:-R)?\s|$)?(?:(?:22N|2)(?:-R)?\s|$)?(?:(?:33N|3)(?:-R)?\s|$)?(?:4(?:-R)?\s|$)?(?:5(?:-R)?\s|$)?(?:6(?:-R)?$)?
这是非常长且非常重复,但如果理解正确,数字必须按顺序递增,所以我没有看到任何其他解决方案......
编辑:
根据你最初的正则表达式,44N,55N和66N似乎是不可能的,所以我把它们删除了
防止字符串以匹配的空格结尾
用一个简单的" |"
答案 1 :(得分:0)
^(?(1(-R))(\ S | $))((2 |?22)N( - R)(\ S | $))((3 | 33)N? ?(-R)(\ S | $))((4-(-R)?)?(\ S | $))((5(-R)?)(\ S | $)????)(6 (-R)?)?$
感谢所有人的快速帮助。
答案 2 :(得分:-1)
这适用于您的示例和解释,我能够理解它:
^((1|2|3|4|5|6|11N?|22N?|33N?|44N?|55N?|66N?)(-R)?)(\s(1|2|3|4|5|6|11N?|22N?|33N?|44N?|55N?|66N?)(-R)?){0,5}$
即:从您的一个数字开始,或者2后跟可选的N,然后是可选的-R;然后重复该模式(前面有一个所需的空间)最多5次。