2012-01-20 68 views
3

在下面我們來說一下我想說的郵政編碼,我試圖從結果中排除33333-
我做的:Java支持有條件的前瞻

String zip = "11111 22222 33333- 44444-4444"; 
String regex = "\\d{5}(?(?=-)-\\d{4})"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(zip); 
while (matcher.find()) { 
    System.out.println(" Found: " + matcher.group());  
} 

希望得到:

Found: 11111 
Found: 22222 
Found: 44444-4444 

我想執行的格式:
5位任選接着 - 和4位。 5位數字只是一個連字符( - )是不想要

我得到異常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7 
\d{5}(?(?=-)(-\d{4})) 
    ^
    at java.util.regex.Pattern.error(Unknown Source) 
    at java.util.regex.Pattern.group0(Unknown Source) 
    at java.util.regex.Pattern.sequence(Unknown Source) 
    at java.util.regex.Pattern.expr(Unknown Source) 
    at java.util.regex.Pattern.compile(Unknown Source) 
    at java.util.regex.Pattern.<init>(Unknown Source) 
    at java.util.regex.Pattern.compile(Unknown Source) 

我這不是正確的使用條件超前?

+1

你想最後一個匹配的'44444-4444'或只是'44444'? –

+0

我想得到'11111''22222''44444-4444',但不是'33333''。我認爲不會包含'33333'' – Cratylus

回答

6

要捕獲所有的數字,除了33333使用此代碼:

String zip = "11111 22222 33333- 44444-4444"; 
String regex = "\\d{5}(?=(-\\d{4}|\\s|$))(-\\d{4})?"; 
Matcher m = Pattern.compile(regex).matcher(zip); 
while(m.find()) 
    System.out.printf("Macthed: [%s]%n", m.group(1)); 

OUTPUT:

Macthed: [11111] 
Macthed: [22222] 
Macthed: [44444-4444] 

說明:此RegEx使用lookahead,它本身就像一個條件,意思是匹配5位數的數字,必須跟隨 - 和4個數字或一個空格或字符串的結尾,然後它可以選擇匹配一個文本 - 和4個數字。

您的原RegEx出現異常的原因是您的RegEx的?:(?=-)部分存在語法錯誤。

+0

我的主要問題是爲什麼我得到異常。我想使用條件提取附加指定格式的數字。 – Cratylus

+0

其實你可以使用'「\\ d {5}(?:(?)修正你的正則表達式中的異常。= - ) - \\ d {4})「'但是這種意願**只捕獲**'44444-4444' – anubhava

+0

但這是否意味着,基於向前看在Java中不工作條件的正則表達式,否則是什麼? ?正確的語法 – Cratylus

0

您在(?之後錯過了冒號,即使用此正則表達式(非Java字符串):\d{5}(?:(?=-)-\d{4})

但是,這可能仍然不會產生你想要的結果。請張貼一些示例輸入和必需的輸出。

+0

這隻會產生44444-4444.I期待'11111 ''22222''44444-4444'.So我的正則表達式(我認爲)會匹配前5位數字,並且有條件的預測也會包含'44444-4444',但不包括'33333-',因爲前面的條件將是錯誤的 – Cratylus

+0

@ Thomas:已更新OP – Cratylus

0

你的問題對我來說有點不清楚。我想你正在尋找:

String st = "11111 22222 33333- 44444-4444"; 
String pattern = "\\d+(-)"; 
String res = st.replaceAll(pattern,""); 
System.out.println(res); 

輸出= 11111 22222 44444-4444

+0

請參閱update.I預計不匹配'33333-' – Cratylus

0
(\d{5}(?!-\s)(?:-\d{4})?) 

因此:

String regex = "(\\d{5}(?!-\\s)(?:-\\d{4})?)";`