这听起来很简单,但我的正则表达式知识是有限的。正则表达式匹配数字或特定字符串(即“全部”)
我需要一个表达式来匹配一个十进制数或字符串“all”,就像在范围验证器中允许单词all代表最大范围一样。
我觉得这样的事情可能工作:
((^[-+]?\d*\.?\d*)|any)
但上面并没有对“任何”工作。
这听起来很简单,但我的正则表达式知识是有限的。正则表达式匹配数字或特定字符串(即“全部”)
我需要一个表达式来匹配一个十进制数或字符串“all”,就像在范围验证器中允许单词all代表最大范围一样。
我觉得这样的事情可能工作:
((^[-+]?\d*\.?\d*)|any)
但上面并没有对“任何”工作。
随着|
正则表达式引擎可能会检查每个可能一个接一个,如果发现匹配立即返回。
由于子表达式
(^[-+]?\d*\.?\d*)
一个空字符串匹配的|
的LHS将始终成功,因此any
部分将始终被忽略。
您应该使该部分不是匹配空字符串,例如,
(^[-+]?(?:\d+\.?\d*|\.\d+))
@Sky:但原始正则表达式有'[ - +]?',所以符号是可选的。我错过了什么? – kennytm 2010-03-19 17:38:16
对吗? - 我的RX阅读障碍 - 我读了班级括号内的插入符号 – 2010-03-19 17:42:39
这是一个不使用正则表达式的解决方案。
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”。
不知道如何解决OP问题,Fredrik。你处于鸡/蛋的情况。提供您的功能的字符串来自哪里? – 2010-03-19 20:53:48
@天空:字符串需要在某个地方,对吧?要么是正则表达式模式,要么硬编码到函数中,要么作为参数传递。我的代码示例只是提供了一种灵活的解决方法。如果最好对其进行硬编码,请从配置文件中读取或从其他位置读取,这很容易完成。通过不将字符串编码到方法本身,它变得更加可重用。 – 2010-03-19 20:58:35
我想你错过了我的观点:OP试图从一些不确定的来源解析十进制值或字符串常量。他如何从这个不确定的来源提供一个可以被你的函数解析的值?一个正则表达式? ;-)并且不要把它看作是你的包。我已经向你投票了。看来这并不能解决问题。而且我并不是暗示你坚持否则。 – 2010-03-19 22:13:06
我不会使用这个正则表达式。对于各种小数点分隔符,千位分隔符等来说过于敏感。如果您有兴趣,我可以发布一个非正则表达式的答案。 – 2010-03-19 17:38:29
@Fredrik - +1。虽然在某些情况下,正则表达式可能是所有需要的。 – 2010-03-19 17:46:05
我继续并发布了一个非正则表达式版本,就像一个替代解决方案。 – 2010-03-19 17:53:04