2012-06-27 21 views
1

我對正則表達式非常陌生,所以我對這個問題的'noobyness'表示歉意...... 我需要爲我們在工作中使用的ID匹配模式。REGEX - 難以掌握基本知識

到目前爲止,該模式的唯一規範是它將有9個字符長,由大寫字母和數字組成。只要字符串的總長度爲9個字符,ID就可以包含1或任何數量的大寫字母或數字。

到目前爲止,我有以下... [AZ] [0-9] {9} 這並不能確保該字符串至少有一個字母或數字(因此一個9個字符的長字符串會通過)。 Alos,我確定它匹配了由非首都組成的9個字母的單詞。

我已經做了一些相當的谷歌搜索,但我還沒有發現任何愚蠢的東西足以讓我理解。

任何幫助非常apppreciated :)

感謝

編輯:只是爲了重溫要求 - 該ID必須爲9個字符,不能多也不能少。它將由大寫字母和數字組成。可以有任何數量的字母或數字,只要該ID包含至少一個(所以BH98T6YUO或R3DBLUEEE或1234R6789

我也會發布我的代碼,以確保位沒有錯......?

string myRegex = "A ton of different combinations that i have tried"; 
Regex re = new Regex(myRegex); 

     // stringCombos is a List<string> containing all my strings 
     // The strings contain within them, my id 
     // I am attempting to pull out this id 
     // the below is just to print out all found matches for each string in the list 
     foreach (string s in stringCombos) 
     { 
      MatchCollection mc = re.Matches(s); 
      Console.WriteLine("-------------------------"); 
      Console.Write(s); 
      Console.WriteLine(" --- was split into the following:"); 
      foreach (Match mt in mc) 
      { 
       Console.WriteLine(mt.ToString()); 
      } 
     } 
+2

*我確定它匹配由非首字母組成的9個字母的單詞*確保您使用的是區分大小寫的搜索模式。 –

+0

「包含1或任何數量的大寫字母或數字」和「字符串的總長度爲9個字符」聽起來有點矛盾。這是可變長度還是固定長度? – nhahtdh

+0

您的模式實際上匹配一個大寫字母后跟9個數字...... –

回答

2

實際上,你必須學會​​的正則表達式語言。曲線是那種陡峭,但也有一噸的基礎優秀的教程。此外,您可能得到這在聊天的情況( SO有一個聊天功能) - 這就是我最初學習它們的方式......

我覺得這樣對於你的情況將不起作用:

[A-Z0-9]{1,9} 

根據您的更新,整整9個元素,使用方法:

[A-Z0-9]{9} 

注意,雖然,要求至少包括一個字母和至少一個數字在這個解決方案中沒有表達。一個簡單的方法可以將第二個和第三個匹配應用於第一個匹配:

[0-9]*[A-Z][0-9]* 
[A-Z]*[0-9][A-Z]* 

從而匹配三次。你可能能夠用向前和向後的參考材料來獲得這個結果,但是你不能用regular grammar來捕獲這個需求。

+0

太棒了!謝謝,一旦我將最後一位改爲{9},它就完美了!道歉原始寬鬆指定對id的要求,我已編輯希望更清楚地顯示這些。再次感謝:D – Jammerz858

+0

但是這也會匹配字符串「12345678AB」並找到ID「12345678A」和ID「2345678AB」,這是否真的是這個要求? –

+0

@BobVale,斑點!謝謝!我更新了我的答案以反映這一點! –

2

你需要匹配開始,然後使用字符串的結尾^和$,這意味着它將匹配9個字符,而不是10

^[0-9A-Z]$ 

你是不是在上述要求精確清晰匹配將匹配大寫或數字9個字符。

您可能會發現Expresso對嘗試表達式很有用。

編輯(有新的要求)如果您要求至少1個大寫字符,您可以使用以下內容。

\b[0-9A-Z]{8}(?:(?<=.*[A-Z].*)[0-9]|(?<=.*[0-9].*)[A-Z])\b 

擊穿

\b匹配的單詞boundry是用大寫

[0-9A-Z]{8} 8個字符或數字

(?:將觸發一個非捕獲組,這是爲包圍或病症

(?<=.*[A-Z].*)[0-9]這基本上匹配[0-9]只要有收到一個AZ某處在第一[0-9A-Z]{8}捕獲

| OR

(?<=.*[0-9].*)[A-Z]這基本上相匹配[AZ] aslong作爲有一個0-9某處之前它在第一[0-9A-Z]{8}捕獲

)緊密的,非捕獲組

\b匹配的單詞boundry

基本上做在前8個字符上匹配,然後如果第9個字符是數字,那麼在前8個字符中必須有大寫字母,如果第9個字母是AZ,那麼在前8個字符中必須有數字

新編輯的版本現在將查找出現在字符串中的ID,而不是要求字符串完全匹配它們。

+0

謝謝你,你對上述表達式的解釋已經爲我清除了一些東西......但是,遺憾的是它並沒有返回任何結果:(我已經編輯了我的問題,希望能夠更多地瞭解我的需求併發布儘可能多的代碼。不幸的是,我無法發佈我退出比賽的字符串。 – Jammerz858

+0

@ Jammerz858,這是因爲你的實際代碼表明你試圖匹配字符串中包含ID的地方,而不是字符串符合條件。你能否確認在你的匹配中肯定會有字詞分隔符。 –