Skip to main content
 首页 » 编程设计

c#之标签的正则表达式匹配

2024年01月01日46jiqing9006

我需要用C#写一个标签的正则表达式,要求如下:

  1. 标签是可选的;
  2. 最多 9 个标签;
  3. 没有重复的标签;
  4. 每个标签最多 30 个字符;
  5. 每个标签只能包含合理的字符(怎么定义?我现在用的是[\w-]);
  6. 标签之间用,分隔(逗号后有无空格可选);
  7. 结尾,(带或不带一个空格)也是合法的。

我已经有了这个:

^(|[\w-]{1,30}(,\s?[\w-]{1,30}){0,8}(,\s?)?)$ 

我发现很难满足所有规则。特别是规则 3。

编辑:

  1. 更新规则 5、规则 6;
  2. 应用规则 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; 
}