2013-04-08 22 views
0
Pattern pattern = Pattern.compile("\\d{4}\\s+[a-z|A-Z]{2}\\s+PLAIN\\sTEXT\\s+(.*?)\\(NS\\)"); 
Matcher matcher = pattern.matcher("2007 AL PLAIN TEXT ap2345 (NS)"); 
while (matcher.find()) 
{ 
    System.out.println(matcher.group(1)); 
} 

我希望它的工作input1 = 2007 AL PLAIN TEXT ap2345 (NS)(上述正則表達式確實爲此工作),但它失敗了input2 = "ap2345"。我想要捕獲這兩個字符串在同一個組號碼,這意味着我需要使以前的捕獲可選。我怎樣才能做到這一點?我如何製作一組可選的捕捉模式並捕捉相同的組號碼?

編輯:::我想同樣的組號碼爲工作時,雙方的字符串值2007 AL PLAIN TEXT ap2345 (NS) OR ap2345

+0

目前'ap2345'位是可選的(。*?)',它應該真的是可選的嗎? – ddmps 2013-04-08 22:31:36

+0

@Pescis'。*?'不是可選的'。*',但它是不情願的量詞,這將使正則表達式找到最小匹配。就像'ababab'正則表達式一樣''(ab)*'會匹配'ababab',但是當我們使用'(ab)*?'時,它只會匹配'ab'。 – Pshemo 2013-04-08 22:39:38

+0

@Phoenix我不太明白你的問題。你是否試圖讓「2007 AL PLAIN TEXT」可選,但不改變組號碼? – Pshemo 2013-04-08 22:41:55

回答

1

我不知道如果我理解正確的問題,所以我才解釋什麼只是檢查這個表達式

(\\d{4}\\s+[a-zA-Z]{2}\\s+PLAIN\\sTEXT\\s+)?(\\w+)(\\s+\\(NS\\))? 

Pattern pattern = Pattern 
     .compile("(\\d{4}\\s+[a-zA-Z]{2}\\s+PLAIN\\sTEXT\\s+)?(\\w+)(\\s+\\(NS\\))?"); 
Matcher matcher = pattern.matcher("2007 AL PLAIN TEXT ap2345 (NS)"); 
while (matcher.find()) { 
    System.out.println(matcher.group(2)); 
} 

例1爲2007 AL PLAIN TEXT ap2345 (NS)輸出 - >ap2345

例2爲ap2345輸出 - >ap2345


此正則表達式將嘗試可選部分2007 AL PLAIN TEXT存儲在組。如果字符串不包含這部分組1將包含null。這是好的,因爲我們只對部分感興趣,它將被存儲在組。我認爲組2將只包含一個詞,這就是爲什麼我使用\\w+\\w匹配字母,數字和_)。如果你想接受更多的話,請嘗試使用(.+?)(\\s+\\(NS\\)|$)

+0

在這兩種情況下,我希望它輸出ap2345 – Phoenix 2013-04-09 12:17:40

+0

@Phoenix「ap2345」存儲在'matcher.group(3)'在這兩種情況下 – Pshemo 2013-04-09 12:38:05

+0

感謝Pshemo工作。但爲什麼它是第3組而不是第2組?也爲什麼我們需要使用\\ w而不是。*? – Phoenix 2013-04-09 13:57:09