C#删除字符串中FIRST的所有额外事件

时间:2017-06-01 17:46:58

标签: c# regex

所以,我有一些代码按照我想要的方式工作,但我想知道是否有更好的方法来使用正则表达式?我玩了一些正则表达式,但没有运气(我知道我需要用正则表达式的东西变得更好)。

此代码纯粹用于删除任何多余的空格或非电子邮件有效字符。然后它会通过并移除超出第一个的额外@符号。

        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\.@-]", "");

            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;
        }

2 个答案:

答案 0 :(得分: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, "(^.+?@)?([^ @]+?)?[@ ]", m => (first++ == 0) ? m.Groups[1].Value+m.Groups[2].Value : m.Groups[2].Value);

答案 1 :(得分:1)

如果您可以通过仅替换捕获的组来实现,那么这应该可以工作。

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

<强> Demo