我有一段C#代碼驗證的文本框字段設置爲正數爲什麼正則表達式isMatch在假時是假的?
Regex isPositiveInt = new Regex("[^0-9]");
return !isPositiveInt.IsMatch(textbox1.Text)
如果正則表達式匹配,我發現,它給「假」,當它不匹配,它給「真」 。所以我必須添加一個「!」到返回值。這沒有問題,但我覺得這是違反直覺的。有人可以解釋爲什麼它會返回相反的結果嗎?
我有一段C#代碼驗證的文本框字段設置爲正數爲什麼正則表達式isMatch在假時是假的?
Regex isPositiveInt = new Regex("[^0-9]");
return !isPositiveInt.IsMatch(textbox1.Text)
如果正則表達式匹配,我發現,它給「假」,當它不匹配,它給「真」 。所以我必須添加一個「!」到返回值。這沒有問題,但我覺得這是違反直覺的。有人可以解釋爲什麼它會返回相反的結果嗎?
[^0-9]
將匹配單字符,不數字。
這是你想要的嗎?
您確定您不是要取代\d+
嗎?
你以爲它反向工作,因爲如果你只測試正數和負數,你將使用的唯一非數字字符將是「 - 」(負號)。所以它會匹配負號,因爲它不是一個數字。因此你會發現你的代碼反向工作。
例如「-987」(真:相匹配的負號),「123」(錯誤:未發現非數字字符)
因此,事實是:你的代碼做反向不工作。你的代碼是錯誤的,做錯了事情。這只是你的輸入是這樣的,它看起來像就像它正在反向工作。
這樣會給像'kas4iudhfki'這樣的輸入帶來積極的結果,因爲在輸入內部找到了模式。 – Guffa 2011-04-02 10:17:13
正則表達式字符類中的^
表示:不在0
到9
的集合中。爲了匹配正整數你想:
[0-9]+
這意味着一個或多個字符從組0到9
注:這也將匹配0其中,嚴格來說,是不是一個正整數。表達式實際上匹配非負整數。
...如果格式沒有標點符號 – sehe 2011-04-02 09:58:04
的^
元字符在正則表達式兩層含義 - 單獨使用時,標記字符串的開始,而作爲[^...]
模式含義的一部分「不匹配的[...]
塊的任何字符」。我想也許你打算改爲^[0-9]
,它會匹配任何以數字開頭的字符串。它不能確保整個字符串是數字,因爲它只檢查第一個字符,並且之後會有任何內容。
如果你想確保你的字符串是數字,只需要^\d+$
是要走的路。 \d
與[0-9]
相同,但更易於閱讀,而^
和$
分別標記字符串的開始和結束。
很酷。將括號中的^的不同含義混淆是一種可能性。 +1 – 2011-04-02 12:26:21
真正的答案
有沒有異議,但我覺得這是違反直覺的。有人可以解釋爲什麼它會返回相反的結果嗎?
確實是:它不是。看看兩次:)
好的一面:你的直覺仍然工作正常。你可以學會信任它。
對不起,如果這似乎有點迂腐,但它沒有明確說明,我認爲它應該是一個被接受的答案。 我們嘗試回答這個問題。既然別人已經超出了很多的幫助,我就不必重複信息:)
你的正則表達式是負組,所以它會一個一個字符是不一個數字的字符串相匹配。結果
例子:
"" false
"0" false
"1" false
"x" true
"42x" true
您可以使用它來趕上非法字符輸入,但你看你不能用一個空輸入和數字輸入之間進行區分。
只匹配數字,你會在兩者之間配合都開始和字符串的結尾(使用^
和$
),以及至少一個數字:
Regex isNonNegativeInteger = new Regex(@"^\d+$");
要匹配一個正整數(其中我不確定你是否真的想要),你必須確保這個值不是零。這將匹配一個數,其中的數字之一不爲零:
Regex isPositiveInteger = new Regex(@"^\d*[1-9]\d*$");
我想下面將填補你尋找什麼
這將檢查整數無小數
\ A([ 0-9] *)\ž
這將甚至識別十進制
\ A([0-9] )\ž| \ A(\ d(\ d。)*)\ž
這意味着,你的模式不像你想象的那樣工作。請發佈樣本,說明如何使用它以及使用哪些數據 – skarmats 2011-04-02 09:48:17
您需要處理您的問題標題。 「爲什麼它是假的,當它是真的」聽起來更適合哲學家......或者佛教禪師...... – 2011-04-02 09:50:38
你的問題違反了問題分析的規則1:你永遠不應該否認明顯的。在心理學中,他們會說「只要你拒絕,你就無法解決你的問題」。一旦擺脫了習慣以抵制這個問題的習慣,你會很快就會看到解決方案。 – sehe 2011-04-02 09:57:19