DEA药物计划变异的正则表达

时间:2017-05-09 13:35:25

标签: regex

通常我对我的正则表达能力非常满意,但我遇到了这个问题。我需要一种模式来验证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个正则表达式做这个。我不能拆分空间然后正则表达部分,这太容易了!任何输入都会有所帮助!谢谢!

3 个答案:

答案 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)

@ sebastian-proske让我走上正轨,非常聪明的先生!使现有的正则表达式结束这一行,或者有一个空格就可以了:

^(?(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次。