.NET正则表达式与否定断言不匹配

时间:2018-10-13 21:16:38

标签: c# .net regex

我有一个文件,只有在DEFAULT_DATABASE = [db_name]不是 db_name的情况下,才需要匹配master形式的字符串。 我正在使用以下正则表达式:

DEFAULT_DATABASE\s*=\s*\[(?!master)\]

,但否定断言不匹配。无论db_name是什么,都将有0个匹配项。我究竟做错了什么?这是我的测试代码:

var inputs = new string [] {
    "some text DEFAULT_DATABASE = [master] more [more] text",
    "some text DEFAULT_DATABASE = [masters] more [more] text",
    "some text DEFAULT_DATABASE = [abc] more [more] text"
};

var re = new Regex(@"DEFAULT_DATABASE\s*=\s*\[(?!master)\]");

foreach (var input in inputs) {
    if (re.IsMatch(input)) {
        Console.WriteLine($"Match: {input}, value: {re.Match(input).Value}");
    }
}

2 个答案:

答案 0 :(得分:1)

为什么不使用基本的Linq?也许我错过了什么... 那这样的事情呢:

var inputs = new string[]{
    "some text DEFAULT_DATABASE = [master] more text"
    , "some text DEFAULT_DATABASE = [masters] more text"
    , "some text DEFAULT_DATABASE = [abc] more text"};

var matchs = inputs
    .Select(x => x.Substring(x.IndexOf("DEFAULT_DATABASE = ["))) // trim start
    .Select(x => x.Remove(x.IndexOf("]") + 1)) // trim end
    .Where(x => !x.Contains("[master]"));

foreach (var input in matchs)
{
    Console.WriteLine($"Match: {input}");
}

Try it online!

答案 1 :(得分:1)

您需要在否定断言中包含右括号,然后在右括号之前输入有效文本:

    var re = new Regex(@"DEFAULT_DATABASE\s*=\s*\[(?!master\]).*?\]");

编辑:模式必须是非贪婪的。