2011-06-09 70 views
2

我有這樣的程序:正則表達式質詢

 Dim words() As String = {"car", "arc", "caar"} 

     For Each w In words 
      Dim rx = Regex.IsMatch("rca", "^[" + w + "]+$") 
      Console.WriteLine(rx) 
     Next 

     Console.ReadLine() 

這個表達式"^[" + w + "]+$"發現它由字母「RCA」的所有單詞。這匹配所有單詞,因爲所有單詞都由「rca」組成。有什麼我可以補充的,爲「caar」返回False,因爲「rca」只有一個「a」,但「caar」有兩個「a」?

+2

您正在構建的正則表達式出來的話,而不是倒過來,因爲我認爲它應該是:' Regex.IsMatch(w,「^ [rca] + $」)'。在你的情況下,單詞「oscar」也會匹配。 – Howard 2011-06-09 16:25:01

回答

3

可以例如做用下面的正則表達式:

"(?=^[^r]*r[^r]*$)(?=^[^c]*c[^c]*$)(?=^[^a]*a[^a]*$)^[rca]+$" 

它匹配由字母「RCA」任何字,但每一個在一次。

附加組件:如果條件是「最多一次」,您可以改用

"(?=^[^r]*r?[^r]*$)(?=^[^c]*c?[^c]*$)(?=^[^a]*a?[^a]*$)^[rca]+$" 
+0

This Works!是否可以通過使用'?'來更改此表達式以允許「ca」,「ra」,「ar」,「r」,「c」和「a」某處? – Cobold 2011-06-09 16:39:16

+0

@Cobold查看我的編輯 – Howard 2011-06-09 16:41:48

+1

+1這非常聰明。你想要匹配的字母越多,它就越不可控,但對於三個字母它仍然可以。 – Tomalak 2011-06-09 16:48:30

0

目前,它看起來像你使用的詞作爲搜索模式的,也許你的意思是:

Dim rx = Regex.IsMatch(w, "^[rca]+$") 

爲了篩選出只包含一個字母在單詞模式( rca),你可以嘗試:

^[^rca]*[rca][^rca]*$ 

這將匹配

"anything not r, c or a" zero or many times; 
"r, c or a"; 
"anything not r, c or a" zero or many times; 
3

這個表達式"^[" + w + "]+$"發現它由字母"rca"

不,它不會所有單詞。它搜索的字符串"rca"對所有發生在在w

意思字母(因爲你的純英文的解釋反映了你想要的)是:

Dim rx = Regex.IsMatch(w, "^[rca]+$") 

*你可以改變+{3},但這仍然會匹配aaa

要匹配任何排列三個字母,您將不得不自己添加排列組合。正則表達式不能爲你做到這一點。

Dim rx = Regex.IsMatch(w, "^rca|rac|acr|arc|car|cra$") 
+0

這不會幫助我,因爲我可以將字母更改爲「rca」和單詞列表。 – Cobold 2011-06-09 16:31:33

+1

@Cobold:*什麼*不會幫助你?事實上,我告訴過你,你會這樣做手動創建排列?我沒有說你必須硬編碼。但是*「我如何獲得VB.NET中每個字符串的排列?」實際上,對於一個單獨的問題來說,它是重要的。 – Tomalak 2011-06-09 16:45:46

1

你必須在正則表達式之外單獨執行。 [...]結構總是將重複字符視爲輸入一次。你可以做類似的Console.WriteLine(rx)之前這一權利(注:C#寫,因爲我在VB中不是很電流):

foreach (var ch in w.ToCharArray()) 
{ 
    if (w.Count(c => c == ch) != "rca".Count(c => c == ch)) 
     return false; 
}