2016-03-22 133 views
0

我學習正則表達式,我已經所著,從字符串得到的數字的方法:正則表達式:區分邊界匹配^和否定

replaceAll("[^\\d]",""); 

以上方法返回只包含數字的字符串。 但我只得到一個正數......如果我想得到一個負數呢?

所以,我試圖改變模式,只考慮數字和字符「 - 」(僅在開始時)。如下:

replaceAll("[^\\d&&[^[^-]]",""); 

replaceAll("[^\\d]&&^[^-]",""); 

和其他幾個......但我沒有得到我想要的結果。也許這可能是一個愚蠢的錯誤,因爲我無法弄清楚。

那麼寫一個正則表達式的正確方法是什麼?在開始時,排除數字和字符「 - 」的正則表達式?

例如:如果我輸入:

$/65*(85gg78,  I get 658578. 
2-340,   I get 2340, And: 
-2-340,   I get -2340 

謝謝!

+0

''&&不是一個正則表達式有意義。我仍然不確定你想要做什麼。請包括一個「之前和之後」的例子。例如,'--28xxx8'會發生什麼?當'[^ ...]'中的第一個字符時,'^'是否定的; ''''''''中的其他字符的正常字符;並在''[']'外面開始行。 – Amadan

+0

@amadan'&&'是字符類交集操作符 – Bohemian

+0

@Amadan我剛剛編輯了一些例子 – tdmsoares

回答

1

分兩步進行,首先刪除非數字但留下負號,然後刪除所有減號,除非它是第一個字符。

String parsed = input.replaceAll("[^\\d-]","").replaceAll("(?<!^)-", ""); 

所以"foo-2-3bar" --> "-23",但"foo2-3bar" --> "23"


僅供參考\D是一樣的[^\d]

+0

謝謝你的回答!但是,只有當我在開頭出現一個數字時有減號「 - 」,它才能正常工作,但在-2-3的情況下,我得到-2-3。 – tdmsoares

+2

如果你在開頭只表示只允許' - ',那就是'(?!^ - \\ d)\\ D' –

+0

@tdm是的,我認爲那裏最多隻有一個減號 - 這就是一些相當混亂的輸入,你正在處理。你想返回什麼輸入'「-2-3」' - '「-23」'? – Bohemian

1

嘗試

String data = "" + 
     "$/65*(85gg78,\n" + 
     "2-340,  \n" + 
     "-2-340,"; 

Pattern pattern = Pattern.compile("(?i)[+-]?\\d+"); 
Matcher matcher = pattern.matcher(data); 
while (matcher.find()){ 
    System.out.println(matcher.group()); 
} 

基於輸入文本:

$/65*(85gg78, 
2-340,  
-2-340,  

正則表達式匹配

65 
85 
78 
2 
-340 
-2 
-340 
+0

我同意匹配比替換這份工作要好,但並不那麼簡單;在Java中,'matches()'期望正則表達式匹配整個字符串。爲此,您需要'find()'方法,該方法僅在'Matcher'類中找到。 –

+0

@AlanMoore,我同意。我只是提示OP如何使用簡單的正則表達式。但我會更新代碼準備複製/粘貼:) – Saleem