正则表达式用于逗号和破折号分隔的项目文本

时间:2017-05-22 09:16:15

标签: java regex

我有一个Java Web应用程序,在那里我从用户那里得到一些输入。一旦我得到这个输入,我必须解析它,parsing部分取决于我将得到什么样的输入。我决定使用Patternjava来预定一些用户输入。

所以我需要最后2个正则表达式模式:

a)咒骂:

输入可以是 - A03,B24.1,A25.7

简单的方法是检查那里是否有逗号([^,]+),但最终会有很多更新解析函数,我想避免。因此,除了逗号之外,还应该检查它是否以

开头
  • 字母
  • 最少3个字母(加上数字)
  • 可以在单词
  • 中有一个点
  • 最少1个逗号(已更新)

b)混合

输入可以是A03,B24.1-B35.5,A25.7

因此,所有的Enumuration部分都得到了,但除此之外,它还可以有一个最小的一个。

我试过使用多个在线正则表达式生成器,但没有弄清楚它。如果你能提供帮助,将不胜感激。

如果它的B24.1-B35.5只是一个简单的范围,那么这就是我得到的。

"='.{1}\\d{0,2}-.{1}\\d{0,2}'|='.{1}\\d{1,2}.\\d{1,2}-.{1}\\d{1,2}.\\d{1,2}'";

Edit1:有效和无效输入

a)Enumaration

  • A03,B24.1,A25.7有效
  • A03,B24.1有效
  • A03,B24.1-B25.1 - 无效,因为在这种情况下(enumaration)它不应包含破折号
  • A03无效,因为没有逗号
  • A03,B24.1 - 有效
  • A03无效

表示b)混合

枚举的所有内容以及它也可以有破折号。

2 个答案:

答案 0 :(得分:2)

您可以根据您的规则将此正则表达式用于(a)枚举部分:

[A-Za-z][A-Za-z0-9]{2,}(?:\.[A-Za-z0-9]{1,})?(?:,[A-Za-z][A-Za-z0-9]{2,}(?:\.[A-Za-z0-9]{1,})?)+

规则:

  • 验证每个细分以字母开头
  • 至少三个字母或数字[A-Za-z][A-Za-z0-9]{2,}
  • 可选地后跟小数.和一个或多个字母和数字,例如(?:\.[A-Za-z0-9]{1,})?
  • 重复同样的事情,并用逗号,分隔。还必须至少使用一个逗号,以便+使用(?:,[A-Za-z][A-Za-z0-9]{2,}(?:\.[A-Za-z0-9]{1,})?)+
  • ?:表示非捕获组
  • 使用[A-Za-z0-9]代替\w以避免下划线

Regex101 Demo

对于(b)混合,您还没有分享太多有效和无效的案例,但根据我目前的理解,这里有我所拥有的:

[A-Za-z][A-Za-z0-9]{2,}(?:\.[A-Za-z0-9]{1,})?(?:[,-][A-Za-z][A-Za-z0-9]{2,}(?:\.[A-Za-z0-9]{1,})?)+

请注意,之前正则表达式中的,已替换为[,-]以允许-

Regex101 Demo

// Will match
A03,B24.1-B35.5,A25.7
A03,B24.1,A25.7
A03,B24.1-B25.1

希望这有帮助!

编辑:确保每个小组都以字母开头(而不是数字) 感谢@diginoise和@anubhava指出!已将[A-Za-z0-9]{3,}更改为[A-Za-z][A-Za-z0-9]{2,}

答案 1 :(得分:0)

正如我在评论中所说,我会用逗号分隔输入并分别验证每个分段。您的域名 ICD 10 CM 代码定义得非常好,而且我会非常警惕任何无效的输入,但会通过验证。

这是我的解决方案:

正则表达式

([A-TV-Z][0-9][A-Z0-9](\.?[A-Z0-9]{0,4})?)

......但是我会避免这种情况。 由于您的域名(很可能是)医疗软件,人们的生命(或至少是幸福)受到威胁。更不用说天文损失和律师永远追逐救护车。因此,避免简单的解决方案,并实施防爆一个。

您可以使用正则表达式来确定给定代码绝对无效。但是,如果代码通过您的正则表达式,则并不意味着它是有效的

防弹方法

请参阅此示例:O09.7, O09.70, O09.71, O09.72, O09.73 有效条目,但O09.1 无效

因此,只需获取所有可能的代码。根据{{​​3}},有42784个不同的代码。只需将它们加载到内存中,任何不在集合中的代码都无效。您可以压缩所述列表并巧妙地了解内存中的编码,以占用更少的空间,但逐字地说所有代码都在磁盘上 300kB 下,因此内存中的MBs 很少因此,为没有离开而不是去除右肾的人的代价支付费用并不是一笔巨大的费用。