C# 使用.NET正则表达式分析引号之间的文本

C# 使用.NET正则表达式分析引号之间的文本,c#,.net,regex,lookahead,lookbehind,C#,.net,Regex,Lookahead,Lookbehind,我有以下输入文本: @"This is some text @foo=bar @name=""John \""The Anonymous One\"" Doe"" @age=38" 我想用@name=value语法将这些值解析为名称/值对。解析前一个字符串应产生以下命名捕获: name:"foo" value:"bar" name:"name" value:"John \""The Anonymous One\"" Doe" name:"age" value:"38" 我尝试了下面的正则

我有以下输入文本:

@"This is some text @foo=bar @name=""John \""The Anonymous One\"" Doe"" @age=38"
我想用@name=value语法将这些值解析为名称/值对。解析前一个字符串应产生以下命名捕获:

name:"foo"
value:"bar"

name:"name"
value:"John \""The Anonymous One\"" Doe"

name:"age"
value:"38"
我尝试了下面的正则表达式,几乎达到了目的:

使用字符串方法

拆分

string myLongString = ""@"This is some text @foo=bar @name=""John \""The Anonymous One\"" Doe"" @age=38"

string[] nameValues = myLongString.Split('@');

在这里,可以使用带“=”的拆分函数,也可以使用IndexOf(“=”

在允许多个同名捕获的情况下,可以使用非常有用的.NET正则表达式功能。另外,您的
(?)
捕获组存在一个问题:它允许在第一个位置使用一个数字,这不符合您的第一个要求

因此,我建议:

(?si)(?:(?<=\s)|^)@(?<name>\w+[a-z0-9_-]+?)\s*=\s*(?:(?<value>[a-z0-9_-]+)|(?:"")?(?<value>.+?)(?=(?<!\\)""))
(?si)(?:(?)?
看


注意,不能在ReGEX101.com上调试.NET特定的正则表达式,需要在.NET兼容环境中进行测试。

是否考虑使用替代?侧注释:考虑是否存在现有的解析器,用于解析任何(SQL?)…至少要对正则表达式重新格式化和注释,以便普通人能够对此进行推理(简单的方法是使用,而不是稍微整理一下解释)…JSON不是一个选项。这不适用于SQL或任何具有现有解析器的现有技术。这是一个非常特定的用例。我不知道您可以通过这种方式使用多个捕获组。这完全解决了我的问题。谢谢!我现在唯一不明白的是,表达式的最后一部分为什么不能在中工作如果我使用文字引号,它将捕获表达式(包括我不想要的引号)。如果我使用lookback,表达式如果单独使用会捕获,但添加到完整表达式中时将不起作用。我归咎于我对lookback的功能缺乏了解,但我不是很确定。此处的任何其他知识都将用于教育目的。我倾向于使用regex hero进行快速在线测试。这是它基于Silverlight,因此作为一种快速而肮脏的测试手段,它相当可靠。Regexstorm也很好,我同时测试了两者,并且使用了Expresso。我还修复了名称捕获,使其看起来像
(?[a-z][a-z0-9_-]*?)
string myLongString = ""@"This is some text @foo=bar @name=""John \""The Anonymous One\"" Doe"" @age=38"

string[] nameValues = myLongString.Split('@');
(?si)(?:(?<=\s)|^)@(?<name>\w+[a-z0-9_-]+?)\s*=\s*(?:(?<value>[a-z0-9_-]+)|(?:"")?(?<value>.+?)(?=(?<!\\)""))