2010-03-19 70 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