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

与数字或特定字符串(即“all”)匹配的regex

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

    这听起来很简单,但我的regex知识有限。

    我需要一个表达式来匹配十进制数或字符串“all”,就像在允许单词all代表最大范围的范围验证器中一样。

    我认为这样的事情可能会奏效:

    ((^[-+]?\d*\.?\d*)|any)
    

    但是上面的内容不适用于“任何”。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Sky Sanders    15 年前

    试试这个

    (((-|\+)?\d+\.?\d*)|any)
    
        2
  •  2
  •   Fredrik Mörk    15 年前

    这里有一个不使用regex的解决方案。

    private static bool IsNumberOrGivenString(string number, string text, CultureInfo culture)
    {
        double result;
        if (double.TryParse(number, NumberStyles.Float, culture, out result))
        {
            return true;
        }
    
        return number.Equals(text, StringComparison.OrdinalIgnoreCase);
    }
    
    private static bool IsNumberOrGivenString(string number, string text)
    {
        return IsNumberOrGivenString(number, text, CultureInfo.InvariantCulture);
    }
    

    样品使用:

    Console.WriteLine(IsNumberOrGivenString("898", "all")); // true
    Console.WriteLine(IsNumberOrGivenString("all", "all")); // true
    Console.WriteLine(IsNumberOrGivenString("whatever", "all")); // false
    Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("sv-SE"))); // true
    Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("en-US"))); // false
    

    这种代码优于使用regex的好处是它(可能)以本地化的方式运行,使用的是任何十进制符号。如果有的话,比如说 . 其中,当该字符不是有效的十进制分隔符时。

    由于字符串比较忽略大小写,因此它也将匹配单词“all”,而不管它是“all”、“all”、“all”还是任何其他大小写字母组合。

        3
  •  1
  •   kennytm    15 年前

    | regex引擎可能会逐个检查每个可能性,如果找到匹配项,则立即返回。

    因为子表达式

    (^[-+]?\d*\.?\d*)
    

    匹配空字符串 γ 将永远成功,因此 any 零件将始终被忽略。

    你应该做这个部分 匹配空字符串,例如

    (^[-+]?(?:\d+\.?\d*|\.\d+))