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

正则表达式将字符串转换为有效数字,无十进制,符号可选

  •  0
  • mk12  · 技术社区  · 15 年前

    我想删除小数点后的所有内容,如果是第一个字符,则删除除连字符以外的所有非数字内容。到目前为止我有这个: /[^0-9^-]|[^\.]+$/ . 注意我是如何阻止破折号被删除的 ^- ,因为我只想删除不是第一个字符的破折号(而不是符号)。有什么帮助吗?谢谢。

    我只想把它取下来

    • 任何非0-9个字符,除非第一个字符是破折号(负号)
    • 包括小数点后的所有内容

    前任。: 10js-_67.09090FD = & gt; 1067
    -10a.h96 = & gt; -10

    编辑:没关系,我走错了路,试图匹配不属于的角色,我意识到我不应该用正则表达式来处理这个问题。不过,谢谢你的回答,我学到了一些关于regex的知识,也许其他有类似问题的人会发现这一点。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Rubens Farias    15 年前

    试试这个:

    Regex numbers = new Regex(@"^(-?\d*)[^0-9]*(\d*)\.", 
        RegexOptions.ECMAScript | RegexOptions.Multiline);
    foreach (Match number in numbers.Matches("10js-_67.09090FD"))
    {
        Console.WriteLine(
            Int32.Parse(
                number.Groups[1].Value + 
                number.Groups[2].Value));
    }
    

    或者这个:

    Console.WriteLine(
        Int32.Parse(
            Regex.Replace(
                "10js-_67.09090FD", 
                @"^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)$", "$1$2", 
                RegexOptions.ECMAScript | RegexOptions.Multiline)));
    

    还是这一个:

    var re = /^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)$/
    alert(parseInt("10js-_67.09090FD".replace(re, "$1$2"),10));
    
        2
  •  1
  •   NawaMan    15 年前

    那就是 /^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/ (用于sed,因为您不告诉我您使用什么语言)。

    /^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/
    // '^'          ==&gtl From the Start
    // '(..)'       ==&gtl Group 1
    //     '-?'     ==&gtl An optiona '-'
    //     '[0-9]+' ==&gtl Some numbers
    // '[^0-9\.]*'  ==&gtl Anything but numbers and dot
    // '(..)'       ==&gtl Group 2 (So this is the number after the dot)
    //     '[0-9]*' ==&gtl Some numbers
    // '.*$'        ==&gtl The rest
    

    然后只打印组1和组2(/\1\2/)。

    测验:

    $:~/Desktop$ echo "10js-_67.09090FD" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
    1067
    $:~/Desktop$ echo "-10a.h96" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
    -10

    希望这有帮助