2011-04-02 73 views
0

我有一段C#代碼驗證的文本框字段設置爲正數爲什麼正則表達式isMatch在假時是假的?

Regex isPositiveInt = new Regex("[^0-9]"); 
return !isPositiveInt.IsMatch(textbox1.Text) 

如果正則表達式匹配,我發現,它給「假」,當它不匹配,它給「真」 。所以我必須添加一個「!」到返回值。這沒有問題,但我覺得這是違反直覺的。有人可以解釋爲什麼它會返回相反的結果嗎?

+0

這意味着,你的模式不像你想象的那樣工作。請發佈樣本,說明如何使用它以及使用哪些數據 – skarmats 2011-04-02 09:48:17

+4

您需要處理您的問題標題。 「爲什麼它是假的,當它是真的」聽起來更適合哲學家......或者佛教禪師...... – 2011-04-02 09:50:38

+1

你的問題違反了問題分析的規則1:你永遠不應該否認明顯的。在心理學中,他們會說「只要你拒絕,你就無法解決你的問題」。一旦擺脫了習慣以抵制這個問題的習慣,你會很快就會看到解決方案。 – sehe 2011-04-02 09:57:19

回答

4

[^0-9]將匹配字符,數字。

這是你想要的嗎?

您確定您不是要取代\d+嗎?

你以爲它反向工作,因爲如果你只測試正數和負數,你將使用的唯一非數字字符將是「 - 」(負號)。所以它會匹配負號,因爲它不是一個數字。因此你會發現你的代碼反向工作。

例如「-987」(真:相匹配的負號),「123」(錯誤:未發現非數字字符)

因此,事實是:你的代碼做反向工作。你的代碼是錯誤的,做錯了事情。這只是你的輸入是這樣的,它看起來像就像它正在反向工作。

+0

這樣會給像'kas4iudhfki'這樣的輸入帶來積極的結果,因爲在輸入內部找到了模式。 – Guffa 2011-04-02 10:17:13

1

正則表達式字符類中的^表示:不在09的集合中。爲了匹配正整數你想:

[0-9]+ 

這意味着一個或多個字符從組0到9

注:這也將匹配0其中,嚴格來說,是不是一個正整數。表達式實際上匹配非負整數。

+0

...如果格式沒有標點符號 – sehe 2011-04-02 09:58:04

6

^元字符在正則表達式兩層含義 - 單獨使用時,標記字符串的開始,而作爲[^...]模式含義的一部分「不匹配的[...]塊的任何字符」。我想也許你打算改爲^[0-9],它會匹配任何以數字開頭的字符串。它不能確保整個字符串是數字,因爲它只檢查第一個字符,並且之後會有任何內容。

如果你想確保你的字符串是數字,只需要^\d+$是要走的路。 \d[0-9]相同,但更易於閱讀,而^$分別標記字符串的開始和結束。

+0

很酷。將括號中的^的不同含義混淆是一種可能性。 +1 – 2011-04-02 12:26:21

0

真正的答案

有沒有異議,但我覺得這是違反直覺的。有人可以解釋爲什麼它會返回相反的結果嗎?

確實是:它不是。看看兩次:)

好的一面:你的直覺仍然工作正常。你可以學會信任它。

對不起,如果這似乎有點迂腐,但它沒有明確說明,我認爲它應該是一個被接受的答案。 我們嘗試回答這個問題。既然別人已經超出了很多的幫助,我就不必重複信息:)

2

你的正則表達式是負組,所以它會一個一個字符是一個數字的字符串相匹配。結果

例子:

""  false 
"0" false 
"1" false 
"x" true 
"42x" true 

您可以使用它來趕上非法字符輸入,但你看你不能用一個空輸入和數字輸入之間進行區分。

只匹配數字,你會在兩者之間配合都開始和字符串的結尾(使用^$),以及至少一個數字:

Regex isNonNegativeInteger = new Regex(@"^\d+$"); 

要匹配一個正整數(其中我不確定你是否真的想要),你必須確保這個值不是零。這將匹配一個數,其中的數字之一不爲零:

Regex isPositiveInteger = new Regex(@"^\d*[1-9]\d*$"); 
0

我想下面將填補你尋找什麼

這將檢查整數無小數

\ A([ 0-9] *)\ž

這將甚至識別十進制

\ A([0-9] )\ž| \ A(\ d(\ d。)*)\ž