2015-04-07 26 views
-1

我們要求社會安全號碼的格式必須是 「xxxx-xx-nnnn」(x是文字,n代表數字,如有效值是xxx-如果第二個是假的XX-5444。使用pattern.compile進行社會安全號碼

我試圖用Java模式和匹配,所以我下面

String SSN_REGEXP = "xxx-xx-[0-9][0-9][0-9][0-9]"; 
... 
assertTrue("SSN " + ssn + " is not of format " + SSN_REGEXP, Pattern.compile(SSN_REGEXP).matcher(ssn).matches()); 

assertTrue將打印的第一個參數。在這種情況下,如果模式沒有比賽

我正在此:

java.lang.AssertionError: SSN xxx-xx-5444 is not of format xxx-xx-[0-9][0-9][0-9][0-9] 

正如你所看到的,SSN是「xxx-xx-5444」。那麼爲什麼這個失敗? 我也試過如下:

"^xxx-xx-[0-9][0-9][0-9][0-9]$" 
"xxx\\-xx\\-[0-9][0-9][0-9][0-9]" 

在Java中,你必須雙反斜線我想是因爲有間接的兩個層面 - 說的無效逸出。

那麼,爲什麼正則表達式不起作用?

+0

X應該是[A-ZA-Z]什麼 – njzk2

+1

你確定你發送的字符串這樣的 「XXX-XX-5444」?我試着在我的機器上,JUnit中的這個斷言很好,沒有錯誤。看起來你在xxx-xx之前有空格字符。 –

+0

這是對的。我只需要做一個ssn = ssn.trim(); – Tony

回答

1

ssn第一個字符實際上是一個空間:

java.lang.AssertionError: SSN xxx-xx-5444 is not of format xxx-xx-[0-9][0-9][0-9][0-9] 
          ^

你的正則表達式不允許在此位置的空間。最好的方法是在驗證之前修整輸入字符串:Pattern.compile(SSN_REGEXP).matcher(ssn.trim()).matches()

請注意matches()匹配整個輸入字符串與模式。如果你想在一個字符串中找到一個模式,你必須使用find()

0

看起來你在SSN的一個空格開頭。 ssn是:xxx-xx-5444。但它應該是xxx-xx-5444

當我們檢查打印字符串的這部分:SSN xxx時,我們可以看到那裏有兩個空格。

相關問題