首页 > 解决方案 > .NET 正则表达式与否定断言不匹配

问题描述

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

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

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

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}");
    }
}

标签: c#.netregex

解决方案


为什么不使用基本的 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}");
}

在线尝试!


推荐阅读