2010-11-26 81 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

相关问题