2017-08-04 19 views
0

我寫了下面的Java代碼:Java進行ICD代碼正則表達式doesn't工作

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] 

是很重要的,那如果在字符串中聲明瞭一個點,則必須至少有一個數字!

我的解決方法僅適用於

的Java的Java像這些被允許像J45或J45.9字符串:

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中使用正則表達式來解決此問題?

+0

我認爲你沒有提供所有的測試用例,或者你的* [point是可選的] [number是可選的] [number是可選的] *規則不正確,因此,在我的an swer。 –

回答

1

[點是可選] [數字是可選] [數字是可選]

你需要做點可選的,{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位數字。

+0

您的解決方案正常工作,謝謝! – Marwief

+0

你能解釋一下,爲什麼你在最後一個表達式中定義了字符':'? Thenaks! – Marwief

+0

@Mwwief請參見[什麼是非捕獲組?問號後跟冒號(?:)是什麼意思?](https://stackoverflow.com/questions/3512471)。在不捕獲子匹配的情況下對兩個替代品進行分組,即不將這些文本存儲在內存中。 –

0

此正則表達式表達:

  • 需要一個大寫字母,接着加入2-號碼數字
  • 隨後的點的任意組合和1-2號碼數字

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