代码之家  ›  专栏  ›  技术社区  ›  Mike

使用REGEX查找除第一个字符外的所有字符

  •  9
  • Mike  · 技术社区  · 15 年前

    我正在构建一个.Net应用程序,我需要从字符串中去掉任何非十进制字符(不包括第一个“.”)。实际上,我是在清理用户输入以强制得到实数结果。

    到目前为止,我一直在使用在线RegEx工具,试图在一个单一的过程中实现这一点,但我没有取得很大进展。

    我希望做到这一点:

    asd123.asd123.123.123 = 123.123123123
    

    不幸的是,我只到了

    asd123.asd123.123.123 = 123.123.123.123
    

    使用这个代码。

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

    但是除了第一个小数点,我一直在试图删除所有的小数点。

    一次就能搞定吗?
    有更好的办法吗?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Tim Pietzcker    15 年前

    这可以在一个regex中完成,至少在.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.
    

    (?<!^[^.]*) means:断言不可能匹配从输入字符串开头开始且仅由点以外的字符组成的字符串。对于第一个点之后的所有点,这个条件都是正确的。

        2
  •  2
  •   alpha-mouse    15 年前

    我认为没有正则表达式会做得更好。

    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());
    
        3
  •  0
  •   Niet the Dark Absol    15 年前

    首先,您当前使用的regex将保留任何|字符不变。你只需要 [^.\d]* 自从 . 没有特别的意义 []

    更换之后,您可以尝试以下操作:

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

    但你只需要这个 . 在号码里。

    希望这有帮助。

    推荐文章