2014-09-25 54 views
0

我已經在Java中編寫了一個reg表達式,它驗證給定的地址,然後創建將分隔出街道號&名稱,城市,州&郵政編碼的組。Java正則表達式輸出

我的代碼如下:

String address = "1600 Pennsylvania Ave NW, Washington, DC 20500"; 
String regex = "(\\s*\\d*\\s*,?\\s*(\\w*\\s*)+),?\\s*(\\w*\\s*)+\\s*,?\\s*(\\w{2})?\\s*,?\\s*(\\d{5})?\\s*"; 

     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(address); 
     if (matcher.matches()) { 
      int groupCount = matcher.groupCount(); 
      System.out.println(groupCount); 
      for (int i=0; i<=groupCount;i++) { 
       String group = matcher.group(i); 
       System.out.println(group); 
      } 
     } else { 
      System.out.println("Does not matches"); 
     } 

代碼的輸出如下所示:

5 
1600 Pennsylvania Ave NW, Washington, DC 20500 
1600 Pennsylvania Ave NW 


DC 
20500 

據我所知,在將O第二線/ P是作爲第一組整個字符串本身按照Javadocs。但是我無法理解的是,爲什麼「華盛頓」沒有被印刷。相反,有2個空間被打印。

有人可以向我解釋這裏有什麼問題嗎?

更多信息:我在期待用戶可能會在地址字符串中輸入(逗號),或者他們可能不會。用戶可以在兩個單詞之間放置多個空格。該州將永遠是一個州代碼。

感謝 拉吉

+0

http://stackoverflow.com/questions/6939526/java-regex-repeating-capturing-groups及其中的指針 – NPE 2014-09-25 18:01:05

回答

1

看不到結果的原因在某些捕獲組中,你是在覆蓋它們。

(\d?)+可能會按照這個順序,match nothing->match digit->match nothing.

你必須把它包在捕獲組是這樣的:((?:\d?)+)

所以固定的正則表達式後,它的作品出來是這樣的:

# "(\\s*(\\d*)\\s*,?\\s*((?:\\w*\\s*)+)),?\\s*((?:\\w*\\s*)+)\\s*,?\\s*(\\w{2})?\\s*,?\\s*(\\d{5})?\\s*" 

(       # (1 start), Adress 
     \s* 
     (\d*)      # (2), Number 
     \s* ,? \s* 
     (       # (3 start), Street 
      (?: \w* \s*)+ 
    )       # (3 end) 
)       # (1 end) 
,? \s* 
(       # (4 start), City 
     (?: \w* \s*)+ 
)       # (4 end) 
\s* ,? \s* 
(\w{2})?     # (5), State 
\s* ,? \s* 
(\d{5})?     # (6), Zip 
\s* 

輸出:

** Grp 0 - (pos 0 , len 46) 
1600 Pennsylvania Ave NW, Washington, DC 20500 
** Grp 1 - (pos 0 , len 24) 
1600 Pennsylvania Ave NW 
** Grp 2 - (pos 0 , len 4) 
1600 
** Grp 3 - (pos 5 , len 19) 
Pennsylvania Ave NW 
** Grp 4 - (pos 26 , len 10) 
Washington 
** Grp 5 - (pos 38 , len 2) 
DC 
** Grp 6 - (pos 41 , len 5) 
20500 
1

的問題是在正則表達式本身。你正在使用嵌套組,而不是最多5個組,你可能會得到更多,爲了解決這個問題,你可以使用'?:'來確定哪些不應該被視爲一個組。即:([\ d] +)爲匹配器創建一個組,但(?:[\ d] +)不)。

但無論如何,我認爲你的正則表達式可能會更好一點,檢查這一個,看看它是否適合您的需要:

"([\\d]+)?(?:\\s?([^,]+)\\,)?(?:\\s?([^,]+)\\,)?(?:\\s?([\\w]{2}))(?:\\s?([\\d]{5}))" 

"([\\d]+)?(?:\\s?([\\w\\s]+)\\,)?(?:\\s?([\\w\\s]+)\\,)?(?:\\s?([\\w]{2}))(?:\\s?([\\d]{5}))" 
+0

一個用於測試匹配組的好網站是http://www.regexplanet.com/advanced/java/index。 HTML – 2014-09-25 18:17:20