用于ICD代码的Java正则表达式不起作用

时间:2017-08-04 06:32:18

标签: java regex

我编写了以下Java代码:

public void test(final String myString){
   final String rule = "^[A-Z]\\d{2}(\\.\\d){0,2}$";
   final Pattern pattern = Pattern.compile(rule);
   final Matcher matcher = pattern.matcher(myString);

   if(!matcher.matches()){
         System.out.println("Failure, the String" + myString + " is not valid!");
   }
}

正则表达式应该通过以下字符串有效:

[character are required][number are required][number are required][point is optional][number is optional][number is optional]

重要的是,如果在字符串中声明了一个点,则必须至少遵循一个数字!

我的解决方案仅适用于J45或J45.9等字符串

允许这样的Java Java:

D99
M00.0
M01.6
J98.3
T05.0
M96.81
D68.20

不允许使用像这样的Java字符串:

9D.0
6G
7H.
M96.811
J234.82
G687.1
GU87.11

如何通过在Java中使用正则表达式来解决此问题?

2 个答案:

答案 0 :(得分:0)

  

[point is optional] [number is optional] [number is optional]

您需要使点可选,并将{0,2}量词仅设置为\d模式:

^[A-Z]\d{2}\.?\d{0,2}$

请参阅regex demo

<强>详情:

  • ^ - 字符串锚的开始
  • [A-Z] - 一个大写的ASCII字母
  • \d{2} - 任意2位数字
  • \.? - 可选
  • \d{0,2} - 任意0到2位
  • $ - 字符串结束。

由于您使用默认情况下固定模式的.matches(),因此您可以在没有^$锚点的情况下声明它

final String rule = "[A-Z]\\d{2}\\.?\\d{0,2}";

查看online Java test

或者,如果点后必须有1或2位数,或者如果不存在点,则允许0到2位数,您可以考虑使用

^[A-Z]\d{2}(?:\.\d{1,2}|\d{0,2})$

请参阅this regex demo,并使用

final String rule = "[A-Z]\\d{2}(?:\\.\\d{1,2}|\\d{0,2})";

其中(?:\\.\\d{1,2}|\\d{0,2})匹配.,然后匹配任何1或2位数字,或任何0到2位数字。

答案 1 :(得分:0)

这个正则表达式:

  • 需要一个大写字母后跟2个数字
  • 后跟一个点和1-2个数字的可选组合

    ^[A-Z]\d{2}(?:\.\d{1,2})?$