我需要用C#写一个标签的正则表达式,要求如下:
- 标签是可选的;
- 最多 9 个标签;
- 没有重复的标签;
- 每个标签最多 30 个字符;
- 每个标签只能包含合理的字符(怎么定义?我现在用的是
[\w-]
); - 标签之间用
,
分隔(逗号后有无空格可选); - 结尾
,
(带或不带一个空格)也是合法的。
我已经有了这个:
^(|[\w-]{1,30}(,\s?[\w-]{1,30}){0,8}(,\s?)?)$
我发现很难满足所有规则。特别是规则 3。
编辑:
- 更新规则 5、规则 6;
- 应用规则 7。
最佳答案
不使用正则表达式:
public static bool TryGetTags(string tagsInput, out string[] tags)
{
Regex regex = new Regex(@"^[\w_-]+$");
tags = tagsInput.Split(',') // Rule 6
.Select(tag => tag.Trim())
.ToArray();
if (tags.Last() == "")
tags = tags.Take(tags.Length - 1).ToArray(); // Rule 7
if (tags.Any(tag => tag == "")) // (no empty tag allowed except last one)
return false;
if (tags.Length > 9)
return false; // Rule 2
if (tags.Any(tag => tag.Length > 30))
return false; // Rule 4
if (tags.Distinct().Count() != tags.Length)
return false; // Rule 3
if (tags.Any(tag => !regex.IsMatch(tag)))
return false; // Rule 5
return true;
}
关于c# - 标签的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668366/