2010-03-19 38 views
0

这听起来很简单,但我的正则表达式知识是有限的。正则表达式匹配数字或特定字符串(即“全部”)

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

我觉得这样的事情可能工作:

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

但上面并没有对“任何”工作。

+1

我不会使用这个正则表达式。对于各种小数点分隔符,千位分隔符等来说过于敏感。如果您有兴趣,我可以发布一个非正则表达式的答案。 – 2010-03-19 17:38:29

+0

@Fredrik - +1。虽然在某些情况下,正则表达式可能是所有需要的。 – 2010-03-19 17:46:05

+0

我继续并发布了一个非正则表达式版本,就像一个替代解决方案。 – 2010-03-19 17:53:04

回答

1

试试这个

(((-|\+)?\d+\.?\d*)|any) 
+0

太棒了!这似乎工作正常。 谢谢。 – HectorMac 2010-03-19 17:36:11

+0

'(?:...)'只是分组。环视是'(?= ...)'和'(?!...)'。 – kennytm 2010-03-19 17:45:41

+0

@肯尼,谢谢你纠正我。今天我有点松动。 – 2010-03-19 17:53:10

1

随着|正则表达式引擎可能会检查每个可能一个接一个,如果发现匹配立即返回。

由于子表达式

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

一个空字符串匹配的|的LHS将始终成功,因此any部分将始终被忽略。

您应该使该部分不是匹配空字符串,例如,

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

@Sky:但原始正则表达式有'[ - +]?',所以符号是可选的。我错过了什么? – kennytm 2010-03-19 17:38:16

+0

对吗? - 我的RX阅读障碍 - 我读了班级括号内的插入符号 – 2010-03-19 17:42:39

2

这是一个不使用正则表达式的解决方案。

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 

与此代码并且使用正则表达式的上升空间是,它(可能)以局部方式运行,使用用于任何十进制符号。如果该号码有一个.,则该号码也会失败,此时该号码不是有效的小数点分隔符。

由于字符串比较忽略了大小写,因此无论它是“all”,“All”,“aLl”还是任何其他大写和小写字母的组合,它都会匹配单词“all”。

+0

不知道如何解决OP问题,Fredrik。你处于鸡/蛋的情况。提供您的功能的字符串来自哪里? – 2010-03-19 20:53:48

+0

@天空:字符串需要在某个地方,对吧?要么是正则表达式模式,要么硬编码到函数中,要么作为参数传递。我的代码示例只是提供了一种灵活的解决方法。如果最好对其进行硬编码,请从配置文件中读取或从其他位置读取,这很容易完成。通过不将字符串编码到方法本身,它变得更加可重用。 – 2010-03-19 20:58:35

+0

我想你错过了我的观点:OP试图从一些不确定的来源解析十进制值或字符串常量。他如何从这个不确定的来源提供一个可以被你的函数解析的值?一个正则表达式? ;-)并且不要把它看作是你的包。我已经向你投票了。看来这并不能解决问题。而且我并不是暗示你坚持否则。 – 2010-03-19 22:13:06