2016-06-15 98 views
2

我想構造一個正則表達式(對於Java)來截斷小數點後面的零。例如正則表達式截斷尾隨零

  • 50.000→50
  • 50.500→50.5
  • 50.0500→50.05
  • -5→-5
  • 50→50
  • 5.5→5.5

想法是以最簡潔的形式表示實數(或整數)。

下面是我建造什麼:

^(-?[.0-9]+?)\.?0+$ 

我使用$1捕捉截斷數字字符串。

與上述模式的問題是,50被截斷至5。我需要一些方法來表達的0+必須遵循.(小數點)。
我試過使用負面後,但不能得到任何比賽。

+0

'^( - ?[\。0-9] +?)(\。0 +)?'' –

+0

像這樣:[regex 101](https:// regex101 .com/r/aJ5kC1/1)? –

+1

您正在使用哪種語言? –

回答

2

最好的解決方案可能是使用內置的特定於語言的方法來執行該任務。

如果您不能使用它們,您可以使用

^(-?\d+)(?:\.0+|(\.\d*?)0+|\.+)?$ 

而且隨着$1$2取代。

查看regex demo。相應地調整正則表達式。下面是解釋:

  • ^ - 串
  • (-?\d+) -Group 1捕捉1個或0減去符號的開始,然後1個或多個數字
  • (?:\.0+|(\.\d*?)0+|\.+)? - 一個可選(匹配1或0次由於拖尾?)非捕獲組匹配3個備選方案:
    • \.0+ - 一個小數點,接着用1+零
    • (\.\d*?)0+ - 第2組捕獲點與任何0+數字,但儘可能少和匹配1+零
    • \.+ - (可選分支,你可以刪除它,如果沒有必要) - 相匹配的尾隨點(S )
  • $ - 字符串結尾。

Java demo

String s = "50.000\n50\n50.100\n50.040\n50.\n50.000\n50.500\n50\n-5"; 
System.out.println(s.replaceAll("(?m)^(-?\\d+)(?:\\.0+|(\\.\\d*?)0+|\\.+)?$", "$1$2")); 
// => [50, 50, 50.1, 50.04, 50, 50, 50.5, 50, -5] 
+0

這裏是[更新的演示](https://regex101.com/r/nF6rY3/2)鏈接。 –

+0

@WingPoon:如果輸入是'-5',你期望得到什麼?它裏面沒有小數部分。據我記得,你需要刪除*小數部分*尾隨零,或者你改變了主意,現在想匹配所有的尾部零? –

+0

您必須將該要求添加到問題中。使用['^( - ?\ d +)(?:\。0+ |(\。\ d *?)0+ | \。+)?$'](https://regex101.com/r/wH5qA8/ 1)。你使用的是什麼方法/代碼? –

1

對於一般的正則表達式應該做的伎倆:

^\d+?0*\.??\d*?(?=0*?[^\d]*$)

您可以替換無論你的邊界應該是插入符號和美元符號。這些可以取代你期望的數字。

基本上:

/d+?非貪婪匹配用於任何數目的(至少需要1號開始比賽)爲一個十進制

\.*??可選匹配。傾向於匹配0次出現

\d*? (?=0*?[^\d]*$) - 非貪婪匹配一個數字,而是將在其通過非數字

編輯進行0止損:我才意識到原來的表達也修剪整數最後爲零,這應該工作。我添加了選項0 match to catch that