2010-09-09 79 views
14

雙解析我有一個看起來像一個字符串 「A = 1.23; B = 2.345; C = 3.567」的Java:如何從正則表達式

我只關心 「C = 3.567」

什麼我迄今是:

 Matcher m = Pattern.compile("C=\\d+.\\d+").matcher("A=1.23;B=2.345;C=3.567"); 

    while(m.find()){ 
     double d = Double.parseDouble(m.group()); 
     System.out.println(d); 
    } 

的問題是,它示出了3從567

輸出作爲單獨:

3.0

567.0

我想知道我怎麼可以包括小數所以輸出「3.567」

編輯:我也想匹配c。如果它沒有小數點: 所以我想要捕獲3567以及3.567

因爲C =也內置到模式中,所以在解析雙精度前我該如何去掉它?

+2

句點( 「」)不是數字。 – 2010-09-09 23:20:25

回答

29

我可能是錯在這部分,但它分離的原因二是因爲 group()將只匹配的最後一個匹配的序列,這是任何東西都通過每次調用 find()匹配。 謝謝,馬克·拜爾斯。

儘管如此,您可以通過在「捕獲組」中放置整個部分來解決這個問題,通過將其放在括號中來完成。這使得您可以將正則表達式的匹配部分組合到一個子字符串中。然後你的格局會是什麼樣子:

Pattern.compile("C=(\\d+\\.\\d+)") 

對於解析3567或3.567,你的模式將是C=(\\d+(\\.\\d+)?)與代表整數1組。另外,請注意,由於您特別想匹配一個時期,要逃避你.(期)字符,這樣它不會被解釋爲「任意字符」令牌。對於這個輸入,不過,不要緊

然後,讓你的3.567,你會怎麼會叫米group(1)搶先指定組(從1開始計數)。這意味着,你的電話Double.parseDouble基本上會成爲Double.parseDouble("3.567")

至於取C =你的格局,因爲我不是精通正則表達式用,我可能會建議對您split您輸入的字符串分號,然後檢查每個分組是否包含C;那麼你可以應用該模式(與捕獲組)來從你的匹配器中獲取3.567。

編輯對於更一般的(可能更有用!)案件gawi的評論,請使用以下(從http://www.regular-expressions.info/floatingpoint.html

Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?") 

這對於可選符號的支持,無論是可選的整數或可選小數部分和可選的正/負指數。根據需要插入捕獲組,以單獨挑選部件。整體而言,指數是在它自己的羣體中,使得它作爲一個整體是可選的。

+1

注意:正則表達式不處理以下浮點數:10 10. 1 1.3e10 1.2e-12 1.41e + 12 – gawi 2010-09-10 01:12:25

+0

@gawi謝謝:)我已經更新了正則表達式的答案,應該做的伎倆。被認爲是有效的浮點數,小數點後面沒有數字? – btlachance 2010-09-10 01:29:03

+1

10.是一個有效的Java語言中的float文字(好吧......確切地說是10.f) – gawi 2010-09-10 01:53:48

2

要匹配的數字和點任何序列可以在正則表達式改成這樣:

"(?<=C=)[.\\d]+" 

如果你想可以肯定,只有一個點,你可能想嘗試這樣的事:

"(?<=C=)\\d+(?:\\.\\d+)?" 

你也應該知道,這種模式可以在ABC=1.2.3;匹配1.2。你應該考慮是否需要改進正則表達式來正確處理這種情況。

4

您的正則表達式只與數字字符匹配。爲了匹配小數點過你將需要:

Pattern.compile("\\d+\\.\\d+") 

.被轉義,因爲這將轉義當匹配任何字符。

注意:這樣只會匹配帶小數點的數字,這就是您在示例中所使用的數字。

1

,如果你需要驗證與句點,逗號,積極和消極的十進制:

Object testObject = "-1.5"; 
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) testObject); 

好運。

+1

是不是{1}隱式? – Cutter 2017-05-28 20:10:14

+1

@cutter是啊,我不記得爲什麼我加了{1}。也許更清楚,或者因爲我在2015年正確地使用正則表達式xD – august0490 2017-05-29 04:45:24

+0

正確處理負數(和正數+正數)的唯一答案。 – Robert 2017-07-14 11:41:56