使用REGEX查找除第一次出现的字符外的所有字符

时间:2010-11-26 16:35:21

标签: .net regex

我正在构建.Net应用程序,我需要从字符串中删除任何非小数字符(不包括第一个'。')。基本上我正在清理用户输入以强制实数结果。

到目前为止,我一直在使用在线RegEx工具试图在一次通过中实现这一点,但我没有走得太远。

我希望实现这一目标:

asd123.asd123.123.123 = 123.123123123

不幸的是,我只是设法进入了

的阶段
asd123.asd123.123.123 = 123.123.123.123

使用此代码。

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

但我试图删除除第一个小数点以外的所有内容。

这可以一次完成吗? 有没有更好的方式?

3 个答案:

答案 0 :(得分: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.

(?<!^[^.]*)表示:断言不可能匹配从输入字符串开头开始的字符串,并且只包含除点之外的字符。这种情况适用于第一个点之后的所有点。

答案 1 :(得分: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());

答案 2 :(得分:0)

首先,您当前使用的正则表达式将保留任何|字符不受影响。您只需要[^.\d]*,因为.[]

中没有特殊含义

在替换之后,您可以尝试这样的事情:

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

但如果数字中只有.,那么你只需要这个。

希望这有帮助。