2016-12-04 101 views
3

我瀏覽過很多正則表達式主題,但這些主題都沒有引導我在特定情況下取得成功。我有一些charsequence,然後轉換爲數組,並提取數字到雙精度數組。Java String replaceAll正則表達式除去數字,點和空格以外的所有東西

asdsad 59 asdf.2 asdf 56 89.a 2.4 wef 95 asdf。

然後我想用正則表達式來刪除多餘的部分,撰寫以下字符串

59 2 56 89 2.4 95

這樣的話我可以只使用.split(" "),並把它們全部都是雙打的陣列。

直到這一刻我用下面的表達

[^0-9.\s] 

但它留下多餘的點,因此不可靠。現在我想要像

[^0-9.\s]|([^0-9]\.[^0-9]) 

,但它不工作,我不是正則表達式真的很不錯,所以你能解釋我爲什麼在過去的表達不工作,如何解決它。

回答

1

你可以在這個表達式直接拆分:

([^\d.]|\B\.|\.\B)+ 

String[] parts = str.split("([^\\d.]|\\B\\.|\\.\\B)+"); 

數組中雖然這(可能)留下前導空白。

要直接去double[]在一行(處理前導空白):

double[] numbers = Arrays.stream(str.split("([^\\d.]|\\B\\.|\\.\\B)+")) 
    .filter(s -> !s.isEmpty()) 
    .mapToDouble(Double::parseDouble) 
    .toArray(); 

live demo

1

添加替代刪除不前與後接一個點和一個數字一個數字點:

[^\d\s.]+|(?<!\d\.\d)\. 

看到這個regex demo

詳細

  • [^\d\s.]+ - 1+比數字,空格字符等和點
  • | - 或
  • (?<!\d\.\d) - 之前沒有以數字,點的位置,數字
  • \. - 一個點。

示例代碼:

String re = "[^\\d\\s.]+|(?<!\\d\\.\\d)\\."; 
System.out.println("asdsad 59 asdf 2 asdf 56 89 .a 2.4 wef 95 asdf.".replaceAll(re, "")); 
System.out.println("asdsad 59 asdf .2 asdf 56 89 .a 2.4 wef 95 asdf.".replaceAll(re, "")); 

Java demo

+0

對不起我的壞,示例沒有包括所有的可能性,請參見新的字符串例如,當我用點後面跟着一個數字替代,但它不是一個數字之前刪除的點,所以我仍然在努力如果它沒有被兩邊的數字包圍,請將其刪除數字 – LPVOID

+0

我會盡快更新。 –

+0

我更新瞭解決方案。 –

1

你試過string.replaceAll("[^\\d\\. ]","")

你可以看到結果這裏:https://regex101.com/r/X6gLaY/2

String string = "asdsad 59 asdf 2 asdf 56 89 .a 2.4 wef 95 asdf."; 
String regex = "[^\\d\\. ]| \\.|\\.$"; 
System.out.println(string.replaceAll(regex,"")); 

Java示例:http://ideone.com/w4BWOZ

輸出: 59 2 56 89 2.4 95

+0

是的,string.split(「」)會產生[59 2 56 89。 2.4 95]在這種情況下,這不是我想要的,因爲我想每一部分解析爲雙 – LPVOID

+0

嗯,其實它不是半心半意並沒有很好的解決方案,因爲字母之間的時間仍然突出自己。我已經投票刪除這篇文章,因爲我實際上沒有時間更好地進行這項工作,並且希望將此視爲一次盡善盡美的嘗試。 –

1

我用正則表達式玩了半天,直到我拿出這個。

顯然,這真的很重要表達的順序是什麼。我想這是因爲它遍歷每個條件,並始終使用以前的條件執行後留下的數據,所以我改變了正則表達式:

  1. 排除所有其次非數字

  2. 排除所有非數字字符,然後

  3. 排除所有遺留的非數字

[^0-9]\.|\.[^0-9]|[^0-9.\s] 

現在,它就像一個魅力。希望它能幫助別人。 :)

相關問題