2011-04-27 60 views
3

我有以下代碼:RegEx a *是否匹配所有字符串?

string rex = "a*"; 
string txt = "cvb"; 
Regex regex = new Regex(rex); 
Console.WriteLine("Success:" + regex.IsMatch(txt)); 

此代碼返回總是真正。 我認爲模式a *只會匹配:「」,「a」,「aa」,「aaa ....」。

我測試了這種情況here

而同樣的例子不匹配。

+0

在您鏈接到的測試網站上,它確實顯示find()可以用於該組合。 – 2011-04-27 15:29:55

回答

12

這隻會是^a*$的情況。由於您沒有使用開始和結束錨點,因此它將始終與任何字符串中的「無」匹配。

+0

'^'和'$'錨是重要的,但更重要的是'*'和'+'之間的區別,你似乎完全錯過了。 – Spudley 2011-04-27 15:23:17

+1

除了他希望它匹配「」,所以'+'是不合適的。 – 2011-04-27 15:24:48

+2

@Spudley,我想*你*錯過了什麼,OP *希望*也匹配一個空字符串。他只是不知道IsMatch是返回部分匹配。 – Blindy 2011-04-27 15:25:18

3

在一個正則表達式的星形表示前述項目的零個或多個occurrances」。

在這種情況下,prededing產品在「正則表達式」中沒有別的東西

因此,這個正則表達式表示「零個或多個'個'字符'

既然您聲明您期望與您的a*匹配'a','aa'或'aaa',那麼您可能想要的不是星星而是一個加號。這將表明「一個或多個前面的項目」。

[編輯]

由於@Bindy說,如果你想匹配一個空字符串,以及任意數量的「一的(我錯過了一個點),那麼你就需要也符合該。

在這種情況下,@ Bindy的解決方案將工作。

另外,使用a+的解決方案是這樣的:

(a+|^$) 

這將匹配一個或更多的「一的,或一個空字符串。請注意,這與@ Bindy的解決方案不同,因爲他的解決方案只匹配字符串只包含'a'而沒有其他內容,而我的匹配任何包含一個或多個'a'或空字符串的字符串。

你的例子並沒有真正涵蓋這些將是你想要的東西(我的預感是你indended更接近於@ Bindy的答案不是這個,但我覺得我還是應該在這裏新增)

+0

感謝您的解釋。我不明白的是爲什麼不同的正則表達式實現會產生不同的結果。 – 2011-04-27 15:32:49

+0

@gonzalog,不同如何?這些簡單的東西在幾乎所有現代正則表達式實現中都是一致的。 – Blindy 2011-04-27 15:51:44

+0

@gonzalog - 我想@Alan Moore的回答很好地解釋了這個問題的答案。 – Spudley 2011-04-27 15:53:11

-1

一個*正在告訴正則表達式解釋器匹配0到很多次。我相信你想要的是a.*,或者如果你希望它影響整個字符串,且僅當第一個字符是一個,然後$a.*^

+0

我認爲它實際上是:'^ a $'。在任何情況下,'+'符號都會比'.'多出'*'。 – PedroC88 2011-04-27 15:28:01

+0

修正了這個問題,儘管它仍然是錯誤的。 – Blindy 2011-04-27 15:29:18

6

如果你把在RegexPlanet仔細一看結果,你會看到那場比賽,而matches()方法失敗,則find()lookingAt()均返回truematches()隱含在兩端的匹配,如果你寫了^a*$lookingAt()僅在開始處自動錨定匹配,而find()根本不錨定。

當然,這些都是Java方法,這是RegexPlanet使用的正則表達式。 .NET的IsMatch()方法相當於Java的find(),並且它沒有等效的matches()lookingAt()(並且不需要它們)。如果你想要匹配的錨定,你必須自己錨定它。

+0

啊。是。這會得到「+1:有洞察力」。這就很好地解釋了OP的困惑是如何產生的。 – Spudley 2011-04-27 15:54:45