我有一个文件,只有在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}");
}
}
答案 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}");
}
答案 1 :(得分:1)
您需要在否定断言中包含右括号,然后在右括号之前输入有效文本:
var re = new Regex(@"DEFAULT_DATABASE\s*=\s*\[(?!master\]).*?\]");
编辑:模式必须是非贪婪的。