2017-05-29 79 views
0

我正在尋找在一階正則表達式匹配多個花車:正則表達式匹配不同的浮動格式

9,487,346 -> should match 
    9.487.356,453->should match 
    38,4 -> match 
    -38,4 -> should match 
    -38.5 
    -9,487,346.76 
    -38 -> should match 

所以基本上應該匹配一個數字:

  1. 編號列表容易
  2. 可能給出了千位分隔符(逗號或點)
  3. 可能是十進制再加上逗號或點作爲分隔符

目前我堅持用

val pattern="\\d+((\\.\\d{3}+)?(,\\d{1,2}+)?|(,\\d{3}+)?(\\.\\d{1,2}+)?)" 

編輯:我主要是與歐洲的符號concered。

例,其中電流模式不匹配:1052161

我想這將是足夠接近匹配的字符串僅包含數字,符號,逗號和點

+0

你目前的模式有什麼問題?它不匹配什麼值? –

+0

使用這個''^ [ - +]?[0-9] * \\。?[0-9] +([eE] [ - +]?[0-9] +)?$「' –

+0

我想你從正則表達式問得太多了。特別是:零或更多**正確的間距**數千個分隔符(**可能是逗號,可能是點**),以及零個或一個分數分隔符(**與千位分隔符**不相同)。把所有這些規則放在單個RE中並不容易。 – jwvh

回答

1

如果像你編輯建議,你願意接受一個簡單的「包含數字,符號,逗號和點」的字符串,那麼這個任務是微不足道的。

[+-]?\d[\d.,]* 

更新

思考了一下,然後考慮一些選項後,我才知道你原來的要求是可能的,如果你允許2種不同的RE模式,一個美國式的數字(逗號前的逗號)和歐式風格的數字(逗號前的點)。

def isValidNum(num: String): Boolean = 
    num.matches("[+-]?\\d{1,3}(,\\d{3})*(\\.\\d+)?") || 
    num.matches("[+-]?\\d{1,3}(\\.\\d{3})*(,\\d+)?") 

注意,千個分隔符是不可選的,所以像"1234"一些不評估爲有效。這可以通過添加更多的RE模式改變:|| num.matches("[+-]?\\d+")

0

根據您的規則,

應該匹配數:

  • 編號列表容易
  • 可能給千個分隔符(逗號或點)
  • 可能是十進制再加上逗號或點作爲分隔符

正則表達式:

^[+-]?\d{1,3}(?:[,.]\d{3})*(?:[,.]\d+)?$ 
  • [+-]?允許+-或沒有在一開始
  • \d{1,3}允許一個3個位數
  • ([,.]\d{3})允許.,作爲千位分隔符,接着3數字(*允許無限制這樣的匹配)
  • (?:[,.]\d+)?允許.,作爲十進制分隔符,後跟至少一個數字。

這匹配所有OP的示例。看看下面的演示更多:

Regex101 Demo

但是一個限制是它允許.,作爲千位分隔符和小數點分隔符和不驗證,如果,是千位分隔符,然後.應是十進制分隔符。因此下面的情況下錯誤地顯示爲匹配:

201,350,780,88 
211.950.266.4 

爲了解決這個問題爲好,前面的正則表達式可以有2層的替代品 - 一個以檢查有,作爲千位分隔符和.爲十進制的符號,另一個檢查反之亦然。正則表達式:

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

Regex101 Demo

希望這有助於!