2012-07-12 52 views
1

以下正則表達式在Eclipse的查找對話框中工作,但在Java中引發異常。模式語法錯誤

我找不到爲什麼在執行時

(?<=(00|\\+))?[\\d]{1}[\\d]* 

的語法錯誤在運行時:

Pattern.compile("(?<=(00|\\+))?[\\d]{1}[\\d]*") 

在我用

(?<=(00|\+))?[\d]{1}[\d]* 

我想匹配的手機查找有或沒有+或00的數字。但那不是重點,因爲我在位置13得到一個語法錯誤。我沒有得到錯誤,如果我擺脫了第二個「?」

Pattern.compile("(?<=(00|\\+))[\\d]{1}[\\d]*") 

請考慮,與其1有時我需要使用更多數量反正問題是關於語法錯誤

+3

您能否提供錯誤訊息? – hsz 2012-07-12 11:54:39

+0

你想匹配什麼字符串? – arnep 2012-07-12 11:55:34

+1

不知道你在做什麼,但你的正則表達式看起來像是等同於'\ d +'。 – nhahtdh 2012-07-12 11:55:48

回答

1

如果您的數據看起來像00ddddd+ddddd其中d是你想要得到@Bergi的正則表達式(?<=00|\\+)\\d+會做的伎倆位。但是,如果你的數據有時沒有要忽略像ddddd那麼你可能應該使用組機制像

String[] data={"+123456","0","123456"}; 
Pattern p=Pattern.compile("(?:00|\\+)?(\\d+)"); 
Matcher m=null; 
for (String s:data){ 
    m=p.matcher(s); 
    if(m.find()) 
     System.out.println(m.group(1)); 
} 

輸出

123456 
123456 
123456 
+0

如果你用你的regexp替換你的regexp怎麼樣?你有語法錯誤嗎? – kingston 2012-07-12 12:34:28

+0

不,我沒有得到任何錯誤與你的正則表達式 – Pshemo 2012-07-12 12:42:52

+0

你確定你檢查了確切的模式?我在第13個位置出現語法錯誤。 – kingston 2012-08-06 12:30:48

0

你可能會縮短你的正則表達式了很多。當內部只有一個類時,不需要字符類 - 只需使用\d即可。而{1}也是無用的。此外,您可以使用+來匹配「一個或多個」(它是{1,}的簡稱)。接下來應該不需要額外的分組。

最後,爲什麼lookbehind可選(與?)?如果你不需要它,就把它丟掉。這甚至可能是你的模式語法錯誤的來源 - 查找一定不能是可選的。

試試這個:

/(?<=00|\+)\d+/ 

的Java:

"(?<=00|\\+)\\d+" 
+0

嗨。謝謝。還有其他原因爲什麼我需要這樣做。我仍然沒有找到爲什麼我得到的語法錯誤 – kingston 2012-07-12 12:26:43

+0

所以,語法錯誤的位置是「?」讓你的lookbehind可選? – Bergi 2012-07-12 12:55:58

+0

是的,但它在eclipse的find中工作正常 – kingston 2012-07-13 10:23:49

0

這裏的任何部分是對我工作的例子:

public static void main(String[] args) { 
     Pattern pattern = Pattern.compile("(?<=00|\\+)(\\d+)"); 
     Matcher matcher = pattern.matcher("+1123456"); 
     if (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 
    }