C# 正则表达式-允许字符,除非某个字符位于字符串的某个部分之前?

C# 正则表达式-允许字符,除非某个字符位于字符串的某个部分之前?,c#,regex,C#,Regex,我不知道这在正则表达式中是否可行,但下面是一个场景。我匹配的字符串是以空格分隔的列表(HTML类)。如果每个单词使用小写字母a-z、空格和/或0-9,则字符串应匹配,除非该单词以@开头 理想结果: 红一绿二蓝三=匹配 重做绿色两个蓝色三个=不匹配(找到大写字母) red-one-blue-two@greenThree=匹配(找到一个大写字母,但单词以@开头) 有什么想法吗?我认为这是不可能的,但也许一位大师知道。您应该能够使用以下表达式来处理该场景,该场景将基本上处理“单词”级别的匹配,只需确保

我不知道这在正则表达式中是否可行,但下面是一个场景。我匹配的字符串是以空格分隔的列表(HTML类)。如果每个单词使用小写字母a-z、空格和/或0-9,则字符串应匹配,除非该单词以@开头

理想结果:

红一绿二蓝三
=匹配
重做绿色两个蓝色三个
=不匹配(找到大写字母)
red-one-blue-two@greenThree
=匹配(找到一个大写字母,但单词以@开头)


有什么想法吗?我认为这是不可能的,但也许一位大师知道。

您应该能够使用以下表达式来处理该场景,该场景将基本上处理“单词”级别的匹配,只需确保每个单词都有一个可选的尾随空格(以空格分隔的方式处理):

这基本上包括两个主要条件:

  • @[a-zA-Z-]+
    • 如果一组字符以“@”字符开头,本节将允许该组字符包含大写字母
  • [a-z-])+
    • 本节是您的“普通”用例,它将只匹配包含小写和连字符的一系列字符
这两个条件都允许在每个集合后使用可选的尾随空格字符,这将允许列表中的每个“单词”单独计算

示例


如果你发布了你尝试过的东西以及为什么它不起作用,它会澄清你需要什么。
^((@[a-zA-Z-]+|([a-z-])+)\s?)+$
var tests = new []{ 
    "red-one green-two blue-three", 
    "redOne green-two blue-three",
    "red-one blue-two @greenThree"
};

foreach(var test in tests)
{
    var regex = new Regex(@"^((@[a-zA-Z-]+|([a-z-])+)\s?)+$");
    Console.WriteLine(regex.IsMatch(test));
}