2012-11-29 62 views
0

我有一個包含奇數貨幣值的字符串。該字符串是:用於奇數貨幣值的正則表達式

Daily interest charges #901 $ 17.2789 259.18 190.07/day

奇數值爲$ 17.2789

我想創建一個正則表達式,將得到的是,但沒有一個反向引用。這是我想出了:

(?:\\$\\s*?\\d{0,1,2,3}\\.\\d{0,1,2,3,4}\\s*?/?day)?

不過,這不會編譯。那裏的一切似乎對我來說合理嗎?任何想法可能會有什麼問題嗎?我使用Java

編輯

我已經試過的\\$\\s*\\d*\\.\\d* m.buettner建議。我把它放在下面的第三組中。這幾乎做到了。這裏是我的全部的正則表達式:

(.*)\s?#(\s?\d{3,4})\s*(?:\$\s*\d*\.\d*)?((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?)\s*((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?).*

它拉的羣體是:

  1. 每日利息費用
  2. 9 259.18
  3. 190.07

它是gr ouping 3就是這個問題。它包含一個額外的數字,第一9

編輯編輯

大家普遍認爲是造成這一問題的空間,這樣做的:

(?:\$\s*\d*\.\d*\s)?

+0

您的量詞(例如'{0,1,2,3}')看起來不正確,除非這是我不熟悉的一些變體。量詞通常表示爲「{x}」,「{x,}」或「{x,y}」。 – David

+2

你的意思是「奇怪」,如「不能被兩個整除」或「奇怪」? –

+0

哎呀,對不起,我可以看到混亂,我的意思是奇怪的。它有4位精度的小數位。 – user489041

回答

3

據我所知\\d{0,1,2,3...}不有效的語法。你的意思可能是:

(?:\\$\\s*?\\d{0,3}\\.\\d{0,4}\\s*?/?day)? 

此外,你是否知道你的整個模式是可選的?這提出了一個問題。 \\d{0,3}\\.\\d{0,4}只會匹配第一個(奇數)號碼。然後你有一個可選的斜線,但是必須是day(如果整個圖案沒有被丟棄)。但是在輸入字符串中,遇到/day之前還有一些其他數字。所以即使它編譯,它也不會匹配你的價格。你應該完全忽略了\\s*?/?day。並考慮去除外部?。正如布萊恩在註釋中指出,沒有必要使\\s重複ungreedy,因爲它和下面的元素是相互排斥的反正:

\\$\\s*\\d{0,3}\\.\\d{0,4} 

而且你真的要這麼具體有關的數數字如果值是「奇怪的」呢?

\\$\\s*\\d*\\.\\d* 
+0

是的,它只是一個較大的一小塊,數字會更容易閱讀。謝謝,讓我給一個鏡頭。 – user489041

+0

+1,打我吧:)也不是'\\ s *?'是多餘的,'\\ s *'本身就很好。 – Brian

+0

我知道,但它之後的角色永遠不會是另一個空白字符,所以無論它是多麼貪婪。 – Brian

1

這種模式

"\\d+\\.\\d{3,}"

將與點後超過2個位數每一個數字相匹配。