正则表达式 - 在最终出现 @ 之前删除特定字符

Posted

技术标签:

【中文标题】正则表达式 - 在最终出现 @ 之前删除特定字符【英文标题】:Regex - Removing specific characters before the final occurance of @ 【发布时间】:2019-07-30 13:02:52 【问题描述】:

所以,我试图在最后出现 @ 之前删除某些字符 [.&@],但在最后一个 @ 之后,应该允许这些字符。

这是我目前所拥有的。

string pattern = @"\.|\&|\@(?![^@]+$)|[^a-zA-Z@]";
string input = "username@middle&something.else@company.com";

// input, pattern, replacement
string result = Regex.Replace(input, pattern, string.Empty);
Console.WriteLine(result);

输出:用户名middlesomethingelse@companycom

目前这会删除所有出现的指定字符,除了最后的@。我不知道如何让它工作,请帮忙?

【问题讨论】:

为什么不在“@”字符上拆分? 【参考方案1】:

你可以使用

[.&@]+(?=.*@)

或者,等价的[.&@]+(?![^@]*$)。请参阅regex demo。

详情

[.&@]+ - 1 个或多个 .&@ 字符 (?=.*@) - 后跟尽可能多的任何 0+ 字符(LF 除外),然后是 @

见C# demo:

string pattern = @"[.&@]+(?=.*@)";
string input = "username@middle&something.else@company.com";
string result = Regex.Replace(input, pattern, string.Empty);
Console.WriteLine(result);
// => usernamemiddlesomethingelse@company.com

【讨论】:

【参考方案2】:

使用SubstringLastIndexOf 只是一个简单的解决方案(以及复杂正则表达式的替代方案):

string pattern = @"[.@&]";
string input = "username@middle&something.else@company.com";

string inputBeforeLastAt = input.Substring(0, input.LastIndexOf('@'));

// input, pattern, replacement
string result = Regex.Replace(inputBeforeLastAt, pattern, string.Empty) + input.Substring(input.LastIndexOf('@'));
Console.WriteLine(result);

试试this fiddle。

【讨论】:

你的输出是:username@middlesomethingelse@company.com 你的模式应该是[.@&]

以上是关于正则表达式 - 在最终出现 @ 之前删除特定字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式删除字符前字符串中间的空格

正则表达式删除一行中第一个空格出现之前的所有内容?

关于grep的使用以及正则表达式

Android/Java 正则表达式从子字符串中删除多余的零

正则表达式在字符串中任何特定单词之前和之后查找特定单词

用于仅从字符串中删除特定特殊字符的正则表达式