C# 正则表达式匹配C中除引号中的字符串以外的所有字符串#

C# 正则表达式匹配C中除引号中的字符串以外的所有字符串#,c#,regex,C#,Regex,我是C#中正则表达式用法的新手。 我想要一个正则表达式从一个给定的列表中找到下一个关键字,但是它没有被引号包围 e、 g。 如果我有如下代码: while (t < 10) { string s = "get if stmt"; u = GetVal(t, s); for(;u<8;u++) {

我是C#中正则表达式用法的新手。 我想要一个正则表达式从一个给定的列表中找到下一个关键字,但是它没有被引号包围

e、 g。 如果我有如下代码:

            while (t < 10)
            {
                string s = "get if stmt";
                u = GetVal(t, s);
                for(;u<8;u++)
                {
                    t++;
                }

            }
while(t<10)
{
string s=“get if stmt”;
u=GetVal(t,s);

对于(;u您可以尝试反向引用,这将使您匹配字符串,但是由于您希望执行完全相反的操作,因此最好转义字符串,这实际上非常简单


要么编写一个匹配字符串的正则表达式,并将其替换为零,要么在文本中跳过带引号的字符串,同时查找关键字。我认为后者会更有效。

我认为正则表达式不容易理解C#关键字。我建议您使用: Microsoft.CSharp.CSharpCodeProvider,使用此Visual studio管理C代码。

尝试以下正则表达式(编辑:修复)

(?:[^\”]|(?:(?:.*?\){2})*?)(?:|^)(?for | while | if)[(]
注意:由于此正则表达式文字包含引号,因此不能在字符串前使用@符号。请记住,如果向字符串添加任何正则表达式特殊字符,则需要对其进行双转义(例如。\w)。确保在与正则表达式匹配时也指定了多行参数,因此插入符号(^)被视为新行的开始

这还没有经过测试,但应该可以完成。如果有任何问题,请告诉我。此外,根据您在这里还想做什么,我可能建议使用标准文本解析(非正则表达式),因为它将根据您想从代码中提取的数据量快速变得更具可读性。希望这对您有所帮助

编辑: 下面是一些示例代码,我已经测试过了,并且非常确信它能按预期工作

var input = "while t < 10 loop\n s => 'this is if stmt'; for u in 8..12 loop \n}"; 
var pattern = "(?:[^\"]|(?:(?:.*?\"){2})*?)(?: |^)(?<kw>for|while|if)[ (]";
var matches = Regex.Matches(input, pattern);
var firstKeyword = matches[0].Groups["kw"].Value;
// The following line is a one-line solution for .NET 3.5/C# 3.0 to get an array of all found keywords.
var keywords = matches.Cast<Match>().Select(match => match.Groups["kw"].Value).ToArray();
var input=“whilet t<10循环\n s=>'这是if stmt';对于8..12循环中的u\n}”;
var pattern=“(?:[^\”]|(?:(?:..*?\”{2})*?)(?:|^)(?for | while | if)[(]);
var matches=Regex.matches(输入,模式);
var firstKeyword=匹配[0]。组[“kw”]。值;
//下面一行是.NET3.5/C#3.0的一行解决方案,用于获取所有找到的关键字的数组。
var关键字=matches.Cast().Select(match=>match.Groups[“kw”].Value).ToArray();

希望这是您现在的完整解决方案…

如果您决定使用正则表达式,您可以测试正则表达式

使用正则表达式可以在任何情况下完成吗

在一般情况下,C#的语法不适合正则表达式解析

考虑以下情况:

method("xxx\"); while (\"xxx");

method(@"xxx \"); while (...);

// while

/* while */

/* xxx
// xxx */ while

/* xxx " xxx */ while ("...

像C#这样复杂的语言需要专用的解析器。

感谢您的回复。是的,在后一种情况下,您建议我必须搜索引号字符串或关键字,以先到者为准。但是,我认为使用正则表达式实际上会减少代码长度。因此,我想找出答案。我不打算只为C#使用代码,但也可能会在其他语言中使用它。另外,我不想找到所有的关键字,但只搜索少数特定的关键字。你可以使用逐字字符串(@),但你需要使用“”而不是\。理查德:好的,我想这只是个人偏好的问题。无论哪种方式,都要注意\”在本例中不是正则表达式转义序列,同样“”只是一个双引号。感谢它工作正常。但是在这种情况下,我应该对正则表达式做什么更改以获取第一个关键字,即在本例中?我假定您正在调用正则表达式选项的Matches方法,只想提取关键字文本。如果返回的Matches集合为'Matches',则匹配[0]。组[0].Value应该为您提供第一个关键字,即匹配项[1]。组[0]。为第二个关键字赋值,依此类推。我尝试了以下代码:string ip=“while t<10 loop\n s=>”this is if stmt';for u in 8..12 loop\n}”;string pattern=@”(?:[^']。(?:(?:..*){2})*?)[^](for | while if)[”,但它同样提供了3个匹配项(前面有空格),if and for.while,它应该只有while和for。检查这个站点并进行正则表达式测试,我发现它更方便用户。好吧,正如我在这篇文章的一条评论中所说的,我不会只在C#上使用它。但是我想要一个正则表达式,我只想更改关键字列表并在输入字符串中获取下一个关键字。
method("xxx\"); while (\"xxx");

method(@"xxx \"); while (...);

// while

/* while */

/* xxx
// xxx */ while

/* xxx " xxx */ while ("...