我想删除所有不必要的字符,以便名称可以有效,这是规则:
•长度在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
答案 0 :(得分:1)
您自己的正则表达式\b([a-zA-Z0-9_-]){3,16}\b
足以满足预期的匹配要求,但是\b
不能胜任工作,将允许部分匹配@smith
之类的单词来给您{{1 }},因为smith
不是单词字符的一部分,因此@
中的s
将匹配,因为smith
和@
之间的点确实是单词边界。您将需要一个不同的正则表达式,以确保单词之前/之后是一个空格以及逗号,因为某些单词后面是逗号,并且您希望将它们算在内。
s
这应该使您仅匹配符合规则的单词。
注意:将(?<= |^)[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
-数字,-_
-连字符或下划线
$
-字符串的结尾
如果此断言成功,则将所有内容与.*
答案 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"