2016-12-26 37 views
1

我的程序運行得如何,但我偶然發現了一些我不明白的東西。瞭解java中的正則表達式

String problem = "4 - 2"; 
problem = problem.replaceAll("[^-?+?0-9]+", " "); 
System.out.println(Arrays.asList(problem.trim().split(" "))); 

打印[4, -, 2]

String problem = "4 - 2"; 
problem = problem.replaceAll("[^+?-?0-9]+", " "); 
System.out.println(Arrays.asList(problem.trim().split(" "))); 

甚至沒有做減號並打印任何東西[4, 2]

爲什麼會這樣,好像都應該工作。

+0

我發現像https://www.debuggex.com/這樣的正則表達式調試webapps非常有用。 – lexicore

回答

3

連字符具有字符類中一個特殊的含義:它用於定義一個字符範圍(如a-z0-9),除了當:

  • 它是在字符類的或立即開始否定字符後^
  • 它是用反斜槓轉義
  • 它是在字符類的末尾
  • 一些正則表達式引擎當它是一個速記字符後類等\w\s\d\p{thing},... (對於這些中的一個,這種情況是不模糊的,它不能是一個範圍)

在第一個例子,它被看作是一個文字連字符(因爲它在開始處)。

在第二個例子中,我假設?-?定義??之間的範圍(即無非是字符?更多)

注:?沒有一個字符類中的特殊含義(它不再是量詞但一個簡單的文字字符)

0

在第二示例中,+?-?裝置「的加號或?和之間的任何字符包括。當然,這意味着只有?,所以整個正則表達式相當於[^+?0-9]+

-不等於「包括之間」的字符類(方括號中)的唯一時間是在字符類的開始處,或者緊跟在開始它的^之後,或者在結束處角色等級或逃脫時間(\-)。

+0

哦,好吧,這是有道理的,謝謝。 – Zoratu

0

如果您試圖匹配[]中的文字-,則必須將其轉義\-。在第一種情況下,^標記比賽的開始,所以你真的比賽-?,所以沒有什麼可逃脫的。在第二種情況下,您似乎正在匹配?-?,這可能會導致正則表達式以您不期望的方式運行。PS:要用Java轉義,你需要\\而不是\