正则表达式使用某些规则删除不必要的符号C#

时间:2019-03-19 16:11:53

标签: c# .net regex expression

我想删除所有不必要的字符,以便名称可以有效,这是规则:

•长度在3到16个字符之间
•仅包含字母,数字,连字符和下划线
•之前,之后或之间没有多余的符号

这是输入:

Jeff,john45,ab,cd,peter-ivanov,@ smith,sh,too_long_username,!lleg @ l ch @ rs,jeffbutt

到目前为止,我的正则表达式是:https://regexr.com/4ahls,我想删除:
@smith
!lleg @ l
ch @ rs

3 个答案:

答案 0 :(得分:1)

您自己的正则表达式\b([a-zA-Z0-9_-]){3,16}\b足以满足预期的匹配要求,但是\b不能胜任工作,将允许部分匹配@smith之类的单词来给您{{1 }},因为smith不是单词字符的一部分,因此@中的s将匹配,因为smith@之间的点确实是单词边界。您将需要一个不同的正则表达式,以确保单词之前/之后是一个空格以及逗号,因为某些单词后面是逗号,并且您希望将它们算在内。

s

Demo

这应该使您仅匹配符合规则的单词。

注意:将(?<= |^)[a-zA-Z0-9_-]{3,16}(?=[ ,]|$) 放在字符集中时,请始终保持开头-的结尾,否则有时会表现得很怪异并产生意外结果。

答案 1 :(得分:0)

您可以尝试以下模式:(?=^[a-zA-Z0-9-_]{3,16}$).+

通常使用积极的前瞻(?=...)来断言某些规则有效,就像您想要的那样。说明:

^-匹配字符串的开头

[a-zA-Z0-9-_]{3,16}-字符类别中最多匹配至少3个字符和16个字符:a-zA-Z-所有字母,0-9-数字,-_-连字符或下划线

$-字符串的结尾

如果此断言成功,则将所有内容与.*

匹配

Demo

答案 2 :(得分:0)

您实际上不需要正则表达式即可解决此问题。使用旧的string.Split()和进程名称

var input = "Jeff, john45, ab, cd, peter-ivanov, @smith, sh, too_long_username, !lleg@l ch@rs, jeffbutt";
var listOfNames = input.Split(new[] {",", " "}, StringSplitOptions.RemoveEmptyEntries)
    .Where(l => l.Length >= 3 && l.Length <= 18) // filter by length
    .Where(l => l.All(c => char.IsDigit(c) || char.IsLetter(c) || c == '-')) // filter by spec chars
    .ToList();

现在您有一个包含四个名称的列表。如果您想将其改回字符串,只需加入您的名字:

var singleLine = string.Join(", ", listOfNames);
// singleLine is "Jeff, john45, peter-ivanov, jeffbutt"