這聽起來很簡單,但我的正則表達式知識是有限的。正則表達式匹配數字或特定字符串(即「全部」)
我需要一個表達式來匹配一個十進制數或字符串「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