2010-11-26 84 views
9

我正在構建.Net應用程序,我需要從字符串中去除任何非十進制字符(不包括第一個'。')。本質上,我正在清理用戶輸入以強制實際結果。查找除REGEX以外的所有字符,但首次出現

到目前爲止,我一直在使用在線正則表達式工具嘗試在一次通過中實現此目的,但我並沒有走得太遠。

我想做到這一點:

asd123.asd123.123.123 = 123.123123123 

不幸的是,我只設法通過使用此代碼去的階段,

asd123.asd123.123.123 = 123.123.123.123 

System.Text.RegularExpressions.Regex.Replace(str, "[^\.|\d]*", "") 

但我卡住試圖刪除所有,但第一個小數點。

這可以通過一次完成嗎?
有沒有更好的方法?

+0

`s/[。]/\ x {DEADBEEF} /; S/[^ \ d \ X {DEADBEEF}。] //克; s/\ x {DEADBEEF} /./;` – tchrist 2010-11-26 16:40:27

回答

6

這可以在一個單一的正則表達式來完成,至少在.NET支持內部lookbehind assertions無限重複:

resultString = Regex.Replace(subjectString, @"(?<!^[^.]*)\.|[^\d.]", ""); 

說明:

(?<!^[^.]*) # Either match (as long as there is at least one dot before it) 
\.   # a dot 
|   # or 
[^\d.]  # any characters except digits or dots. 

(?<!^[^.]*)指:斷言無法匹配從輸入字符串開頭開始並僅由其組成的字符串點以外的字符。對於第一個點之後的所有點,這種情況都是正確的。

0

首先,您正在使用的正則表達式會留下任何|字符不變。你只需要[^.\d]*因爲.[]

在此之後沒有特殊的含義更換,你可以嘗試這樣的事:

Replace(str, "([\d]+\.[\d]+)[^\d].*", "\1"); 

但是你只需要這個,如果有一個.都在數。

希望這會有所幫助。

+0

感謝您修復第一部分。根據http://regexpal.com/你的第二個正則表達式將匹配所有的123.123.123.123是所需的效果?我以前沒見過「\ 1」。 – Mike 2010-11-26 16:55:18

+0

嗯,第二個正則表達式應該匹配所有它,然後用\ 1(它應該是第一個子模式,在(()`中的部分)只留下123.123 - 除非.NET使用與我不同的正則表達式系統習慣於! – 2010-11-26 16:58:40

2

我認爲沒有正則表達式會更好。

string str = "asd123.asd123.123.123"; 
StringBuilder sb = new StringBuilder(); 
bool dotFound = false; 
foreach (var character in str) 
{ 
    if (Char.IsDigit(character)) 
     sb.Append(character); 
    else if (character == '.') 
     if (!dotFound) 
     { 
      dotFound = true; 
      sb.Append(character); 
     } 
} 
Console.WriteLine(sb.ToString()); 
+0

謝謝你,我感謝這個答案。它甚至沒有想過嘗試這種邏輯。我希望我能接受2個答案。 – Mike 2010-11-29 09:55:05

相關問題