2017-09-24 68 views
-1

由於沒有關於如何做到這一點的教程和每個問題都有其獨特的解決方案,所以我無法理解這將如何實現它的工作。我試圖做的是刪除不符合要求的行。每一行都有一個單詞。使用richTextBox。先進的正則表達式

我對每一行的要求是:

  • 分鐘3號
  • 最多25個字母
  • ATLEAST 1號
  • ,包括至少一個字母

如果任何這些要求在一行中無效,該行被刪除。 我是打(沒有成功),代碼爲:

richTextBox1.Text = Regex.Replace(richTextBox1.Text, "(a-z).*?(0-9)", ""); 
+2

「最少3個數字」和「至少1個數字」 - 那麼確切的最小數量是多少?一個三? –

+1

「既然theres沒有指導如何做到這一點,每個問題都有其獨特的解決方案」Whaaat?你的意思是沒有[在線資源](https://regexone.com/)正則表達式?沒有任何教程能夠給你提供確切的解決方案,甚至沒有關閉每一個地方都有大量的pwd正則表達式驗證!甚至有工具可以爲你編寫。 –

+1

[Regex for password必須包含至少8個字符,至少包含一個數字以及大小寫字母和特殊字符](https://stackoverflow.com/questions/19605150/regex-for-password-must - 至少包含八個字符 - 至少一個數字) –

回答

-1

我認爲你不需要爲這個任務正則表達式。只是檢查與簡單的LINQ查詢您的RichTextBox的每一行是這樣的:

// rtb is a RichTextBox; 
var sb = new StringBuilder(); 
foreach (var line in rtb.Lines) 
{ 
    var numbers = line.Count(char.IsDigit); 
    var letters = line.Count(char.IsLetter); 

    if (numbers < 1 || numbers > 3 || letters < 1 || letters > 25) 
     continue; 

    sb.AppendLine(line); 
} 
rtb.Text = sb.ToString(); 
0

如上所述,「最少3位數」和「至少1位數」是衝突的要求。我假設你的意思是最多3個數字。 如果是這樣(但您可以適應其他要求),讓我們一步一步構建您的正則表達式。

  1. 快報:你可以匹配一個喜歡的東西[a-zA-z]或更好[\p{L}]如果你想利用非平凡的字母考慮進去,例如重音字母
  2. 編號:與[\d]相匹配
  3. 重複實例:如果您想要在一個字符的m個和n個實例之間,例如一個號碼,寫[\d]{m, n}
  4. 線:一條線是由^$對之間,它可以包括標點符號,空格等
  5. 計數實例:如果你只是想計算的情況下,使用向前看符號;如果你想確保你得到了一定的匹配(如1和3之間的線路,這意味着^[\d]{1,3}$在正則表達式方面的數字),內(?=)
  6. 零括IT運更多的字符:使用*,如「零或更多數字「變成[\d]*
  7. 與給定字符不同:如果您尋找不同的字符,例如從一些,才使用插入符號(^),如[^\d]
  8. 任何字符:與.
  9. 「至少」選擇:也就是說,你也可以從這些不同的其他字符,你之前搜索,可能是兩個之後。如果您查找可能有或可能未包含一個或多個非數字的號碼,請寫[^\d]*[\d];如果你找了一些可能會或可能不會被前面和/或後面跟着一個或多個非數字,寫[^\d]*[\d][^\d]*

所以,你的要求是包含

    之間
  • 每一行匹配1首3個數字(不管是什麼之前或之後他們每個人):1個25個字母之間 (?=(^([^\d]*[\d][^\d]*){1,3}$))
  • (不管是什麼之前或之後他們中的每一個): (?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))

由於您剛剛使用上述兩個正則表達式檢查了數字和字母計數,但實際上並未選擇任何內容,您仍然必須實際匹配任何內容。 要匹配任何長度的行,請寫\b.*\b

將所有內容放在一起,你會得到

(?=(^([^\d]*[\d][^\d]*){1,3}$))(?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))^.*$ 

相關鏈接:thisthis one。測試here