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

标签 c# regex tags

我需要用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;
}

关于c# - 标签的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668366/

相关文章:

c# - 将巨大的 sql 转储文件拆分成尽可能小的 block

regex - python正则表达式-列表中的re.findall()

php - 如何使用 `preg_match()` 匹配用户名

java - 正则表达式 - 转义或字符 block ?

ruby-on-rails - 在 acts_as_taggable_on_steroids 中按字母顺序对标签云进行排序

c++ - 为什么允许在 noexcept 标记的函数中抛出异常?

C# 向xml文件中添加数据

c# - 根据下图,wpf 中的滚动条样式

c# 从邮件中查找邮件

php - 查找相关标签