我编写此代码以验证用户名是否符合给定条件,是否有人看到我如何将2个RegEx合并为一个?代码是c#
/// <summary>
/// Determines whether the username meets conditions.
/// Username conditions:
/// Must be 1 to 24 character in length
/// Must start with letter a-zA-Z
/// May contain letters, numbers or '.','-' or '_'
/// Must not end in '.','-','._' or '-_'
/// </summary>
/// <param name="userName">proposed username</param>
/// <returns>True if the username is valid</returns>
private static Regex sUserNameAllowedRegEx = new Regex(@"^[a-zA-Z]{1}[a-zA-Z0-9\._\-]{0,23}[^.-]$", RegexOptions.Compiled);
private static Regex sUserNameIllegalEndingRegEx = new Regex(@"(\.|\-|\._|\-_)$", RegexOptions.Compiled);
public static bool IsUserNameAllowed(string userName)
{
if (string.IsNullOrEmpty(userName)
|| !sUserNameAllowedRegEx.IsMatch(userName)
|| sUserNameIllegalEndingRegEx.IsMatch(userName)
|| ProfanityFilter.IsOffensive(userName))
{
return false;
}
return true;
}
答案 0 :(得分:6)
如果我理解您的要求,下面应该是您想要的。 \w
匹配字母,数字或_
。
negative lookbehind((?<![-.])
部分)允许_
,除非前面的字符为.
或-
。
@"^(?=[a-zA-Z])[-\w.]{0,23}([a-zA-Z\d]|(?<![-.])_)$"
答案 1 :(得分:1)
尝试在最后一个字符类中添加一个贪婪的+
,并让中产阶级非贪婪:
@"^[a-zA-Z][a-zA-Z0-9\._\-]{0,22}?[a-zA-Z0-9]{0,2}$"
这将禁止以.
,-
或_
的任意组合结尾的任何内容。这并不是你在原始正则表达式中所拥有的,但我认为它可能就是你想要的。
答案 2 :(得分:1)
^[a-zA-Z][a-zA-Z0-9._-]{0,21}([-.][^_]|[^-.]{2})$
这真的越来越近了(它满足了你的所有要求,除了它至少需要三个字符,而不是一个)。一个人需要对C#的正则表达式功能进行一些研究,我现在没有时间,但我希望这能让你朝着正确的方向前进。
答案 3 :(得分:1)
朋友,你只有四个表达式要在字符串的末尾验证,对吧?因此,使用第一个正则表达式验证用户名,然后使用字符串函数检查这四个结尾。它不会消耗比正常表达式更多的时间处理。
尝试使用方法string.EndsWith()来验证'。',' - ','。'或' - '