【问题标题】:Regex for fixed length floating point number固定长度浮点数的正则表达式
【发布时间】:2014-03-20 07:54:35
【问题描述】:

我正在使用这个正则表达式来匹配 8 位有符号浮点数。

  string exp= "12345678";
  string regEx1="^([-+]?[(\\d+\\.?(\\d+)?)]{1,8})($)";
  Regex topRowRegx = new Regex(regEx1, RegexOptions.IgnoreCase | RegexOptions.Multiline);
  Match matchResult = topRowRegx.Match(exp.Trim());

不管 -/+ 和 .符号它应该匹配 1 到 8 位数字。

它应该匹配 -1.2345678、123.45678、+12.34、1.2、1、12345678、1254。 如果有小数点符号,小数点前和小数点后应至少有一位数字。

上面的表达式工作正常,但是当我使用 -/+ 或 .带有 8 位数字。 您能帮我如何准确识别 8 位数字并保留剩余符号计数吗?

更新: Vasili Syrakis 的回答解决了上述问题。只是出于好奇,为什么这没有给出正确的结果?

   string exp = "text> -9.9999999 \"some text here\"";
   var resultNumber = Regex.Match(exp, "[-+]?(\\d{1,8}|(?=\\d\\d*\\.\\d+?$)[\\d\\.]{1,9})");
   ("Result:"+resultNumber.ToString()).Dump();

【问题讨论】:

    标签: regex c#-4.0 linqpad


    【解决方案1】:

    改变的正则表达式:

    ^[-+]?(\d{1,8}|(?=\d\d*\.\d+?$)[\d\.]{1,9})$
    

    转义版本:

    ^[-+]?(\\d{1,8}|(?=\\d\\d*\\.\\d+?$)[\\d\\.]{1,9})$
    

    说明

    它会找到一个 8 位数字
    或者它会找到一个句点或数字的 9 个实例......仅当有 1 个句点分隔数字时。 9 表示周期。

    在线演示

    http://regex101.com/r/kD1oT6

    【讨论】:

    • 接受超过 8 位数字。检查 -12345678.90
    • 修改后的工作正常,但它接受这些数字“-.12345678”和“-12345678”。小数点前后至少要有一位数
    • 非常感谢 Vasili Syrakis。现在工作正常。这个也有效 ^[-+]?(\\d{1,8}|(?=\\d+\\.\\d+)[\\d\\.]{1,9})$跨度>
    • 优秀:) 很高兴听到它
    • 对不起,^[-+]?(\\d{1,8}|(?=\\d+\\.\\d+)[\\d\\.]{1, 9})$ 对于这个数字 11.0.1 将失败。你的答案是正确的。
    【解决方案2】:

    试试这个正则表达式:

    ^[+-]?(?:(?=\d+\.\d+$)[\d.]{3,9}|(?=\d+$)\d{1,8})$
    

    基本上它有两个正则表达式 OR'ed 在一起。第一个是检查模式线xx.xx,表示点两侧的数字。这意味着它可以有最小 3 到最大 9 的长度。

    第二个是尝试匹配格式中的数字xxxx。这意味着它可以有 1 到 8 个长度。

    你可以从this link获得更多关于这个正则表达式的解释。

    【讨论】:

    • 我已经像这样修改了正则表达式以匹配我的场景 ^[+-]?(?:(?=\d+\.\d+$)[\d.]{1,8}|( ?=\d+$)\d{1,8})$。但是这个数字失败了 -1234.5678
    • @Sree 建议的正则表达式(不是您修改的那个)在-1234.5678 上失败有什么原因吗?
    • @Sree 你的修改是错误的,我必须说。请查看我的回答中的说明,了解我为什么使用{3,9} 而不是您的{1,8}
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2012-09-20
    相关资源
    最近更新 更多