2017-06-01 25 views
0

所以,我有一些代碼按照我想要的方式工作,但我想知道是否有更好的方法來使用正則表達式來完成此操作?我玩過幾個正則表達式,但沒有運氣(我知道我需要用正則表達式來改進)。C#刪除所有額外的事件超越字符串的第一個

此代碼純粹設計用於刪除任何多餘的空格或非電子郵件有效字符。然後它會通過並移除超出第一個的額外@符號。

 List<string> second_pass = new List<string>(); 
     string final_pass = ""; 

     if (email_input.Text.Length > 0) 
     { 
      string first_pass = Regex.Replace(email_input.Text, @"[^\w\[email protected]]", ""); 

      if (first_pass.Contains("@")) 
      { 
       second_pass = first_pass.Split('@').Select(sValue => sValue.Trim()).ToList(); 

       string third_pass = second_pass[0] + "@" + second_pass[1]; 

       second_pass.Remove(second_pass[0]); 
       second_pass.Remove(second_pass[1]); 

       if (second_pass.Count > 0) 
       { 
        final_pass = third_pass + string.Join("", second_pass.ToArray()); 
       } 
      } 

      email_output.Text = final_pass; 
     } 
+1

什麼是電流輸出,或者是怎麼回事意外不對您當前密碼的任何明確的例子嗎? – SWLim

+0

@SWLim沒有什麼是錯的代碼,我只是問是否有辦法處理正則表達式,而不是我所擁有的。 –

+0

對不起,我誤解了你的問題 – SWLim

回答

1

通過你的描述去,而不是代碼:

var final_pass = email_input.Text; 
var atPos = final_pass.IndexOf('@'); 
if (atPos++ >= 0) 
    final_pass = final+pass.Substring(0, atPos) + Regex.Replace(final_pass.Substring(atPos), "[@ ]", ""); 

對於(幾乎)純的正則表達式的解決方案,使用廉價的狀態,這似乎是工作:

var first = 0; 
final_pass = Regex.Replace(final_pass, "(^[email protected])?([^ @]+?)?[@ ]", m => (first++ == 0) ? m.Groups[1].Value+m.Groups[2].Value : m.Groups[2].Value); 
+0

這工作得很好。我喜歡整個使用Substring。仍然希望有一個純粹的正則表達式來做到這一點,但這仍然非常好。謝謝! –

+0

我添加了一個只使用'Regex.Replace'和一個狀態作弊的例子。 – NetMage

+0

我刪除它不工作 - 仍在想。 – NetMage

1

如果只能取代捕獲的組,那麼這應該能夠工作。

([^\w\.\@\-])|(?<=\@).*?(\@)

Demo

+0

這看起來不錯,但是使用子字符串似乎更安全。我一定會將此添加到我的圖書館,謝謝! –

相關問題