2012-07-24 122 views
1

學習正則表達式,但這個讓我很頭疼。我需要匹配一個浮點數(要麼是.要麼是,作爲小數點),它必須以下列字符結尾:€/gJavaScript正則表達式以字符串結尾的浮點數

有效的匹配應該是例如:

  • 40€/g
  • 43.33€/g
  • 40,2€/g
  • 40.2€/g
  • 38.943€/g

欣賞幫助..

+3

到目前爲止您嘗試了哪些表情?你到底有什麼問題? http://www.regular-expressions.info/是開始學習正則表達式的好地方。 – 2012-07-24 11:49:58

+1

@TimPietzcker他說'.'或','爲小數點,所以我認爲不是:) – epoch 2012-07-24 11:50:32

+1

你試過什麼樣的表情,出了什麼問題?你有[演示我們可以玩](http://jsfiddle.net/)?幫助我們來幫助你。 – 2012-07-24 11:50:32

回答

6

正則表達式看起來像:

\d+(?:[.,]\d+)?€/g 

在Javascript中,作爲一個正則表達式對象(注意,正斜槓需要轉義):

/\d+(?:[.,]\d+)?€\/g/ 

這裏有一個細分每個部分的功能:

\d+ # one or more digits 
(?: # ... don't capture this group separately 
[.,] # decimal point 
\d+ # one or more digits 
)? # make the group optional 
€/g # fixed string to match 

如果您想允許類似.123€/ g是有效的,以及,你可以使用:

(?=[.,]|\d)(?:\d+)?(?:[.,]\d+)?€/g 

也就是說,兩個數字的組是可選的,但至少有一個必須存在(這使用lookahead,這是需要一些技巧)。

請注意,這也會匹配'word2€/ g'等結構。如果要防止出現這種情況,請使用(?<=^|\s)(如果前面有空格或字符串的起始位置,則匹配)以(?=$|\s)(如果後跟空格或字符串末尾,則匹配)結束。

完全成熟的版本:

(?<=^|\s)(?=[.,]|\d)(?:\d+)?(?:[.,]\d+)?€/g(?=$|\s) 
+0

偉大的答案,謝謝!它完美地工作。如果我希望匹配的浮點數以「€/ g」或「/ g」結尾? 嘗試過,但似乎沒有工作: /\ d +(?:[。,] \ d +)?[(€\/g)|(\/g)]/ – jpaw 2012-07-24 12:28:37

+1

@urbffe:'[(€ \/g)|(\/g)]'是一個字符類,它只會匹配**提供的字符**。即它與[()€/ g]'相同。我想你想要'(€\/g | \/g)'。 – 2012-07-24 12:42:08

+0

你是對的!這樣可行。謝謝一堆! – jpaw 2012-07-24 13:20:14

2
\d+([.,]\d+)?€/g 

應該工作,我猜。

+0

你必須在正則表達式中轉義'/',但是表達式看起來很好。 – 2012-07-24 11:59:17

+1

作爲我自己的一個規則,我從來沒有像在語言中那樣使用文字形式的正則表達式。這簡化了很多,特別是對於Java(沒有文字字符串)或PHP(你必須使用字符串*和*分隔符 - 瘋狂)。我通常假設讀者對這種語言有足夠的瞭解,以便將正則表達式本身適用於他們正在使用的語言:-) – Joey 2012-07-24 12:16:02

+0

*我通常假設讀者已經足夠了解該語言,從而使正則表達式本身適應它們所使用的語言使用* ...我希望它是如此:)然而,我喜歡你的態度......快樂的編碼! – 2012-07-24 12:19:29

0

你確定你需要一個正則表達式嗎?使用可用的內置浮點解析可能會更容易:在歐元符號之前採取任何措施,將逗號標準化爲小數(反之亦然,無論結束工作),然後嘗試使用Number函數進行解析。請注意,您需要檢查轉換是否與Number.isNaN函數一起工作。

另一種可能性是隻使用parseFloat函數。由於它會忽略數字後的任何字符,因此它會將"40€解析爲40.0。但是,它可能不是你想要的,因爲它也允許諸如"40a""40b"之類的東西。

+0

感謝您的回答。我明白你的意思,但這不完全是我要找的。我正在搜索一個大字符串,用於附加具體的€/ g的浮點數字。 – jpaw 2012-07-24 12:25:38

+0

即使這樣,你可以不用做一個複雜的正則表達式,而是搜索「看起來像一個數字」(但只需要一個更簡單的正則表達式),然後使用內置解析函數對列表進行過濾。 – hugomg 2012-07-24 12:31:48

相關問題