正则表达式组匹配没有字边界

时间:2013-12-10 17:38:35

标签: c# regex

我正在尝试创建一个函数,当字符串没有特定的字符组时返回true(在本例中,该组是“DontMatchMe”)

以下示例:

example1  
examDontMatchMeple2  
example3  
examDontMatchMeple4  
example4  

有效匹配是:

example1  
example3  
example4  

我的第一个选择是使用模式.*(?!DontMatchMe).*,但.*消耗所有内容,匹配始终为真。

请注意,我实际使用的字符串上的值是随机的。例如,我不能使用“exe”来构建正则表达式。 “DontMatchMe”也是随机的。

2 个答案:

答案 0 :(得分:2)

要排除特定字词,您可以使用以下格式:^(?!.*DontMatchMe).+

为了避免.*消耗所有内容的问题,您可以将模式锚定到字符串的开头。模式细分如下:

  • ^:锚定到字符串的开头
  • (?!.*DontMatchMe):与任何字符和要忽略的文字匹配的否定预测
  • .+:最后,匹配一个或多个字符(只要前瞻不匹配就会发生)

示例:

string[] inputs = 
{
    "example1",
    "examDontMatchMeple2",
    "example3",
    "examDontMatchMeple4",
    "example4"
};

string ignoreText = "DontMatchMe";
string pattern = String.Format("^(?!.*{0}).+", Regex.Escape(ignoreText));

foreach (var input in inputs)
{    
    Console.WriteLine("{0}: {1}", input, Regex.IsMatch(input, pattern));
}

答案 1 :(得分:0)

如果它是您要检查的简单非正则表达式字符串,则只需使用Contains方法并反转结果:

bool doesNotContain(string s, string group) {
    // error check for nulls first (not included here)
    return !s.Contains(group);
}

如果您希望您的小组可能成为正则表达式,您仍然可以使用相同的原则。寻找你不想要的模式,如果它返回false,否则返回true。这可能更容易阅读和理解,特别是对于不熟悉正则表达式的更高级概念的人,例如负向前瞻。