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

时间:2009-03-05 11:31:39

标签: c# regex

我是C#中使用正则表达式的新手。 我想要一个正则表达式来查找给定列表中的下一个关键字,但不包含引号。

e.g。 如果我有一个看起来像的代码:

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

            }

我尝试使用正则表达式作为@“(。*?)\ s(FOR | WHILE | IF)\ s” 但它给了我“if”作为下一个关键字。 然而,我希望在“for”之后得到下一个关键词,而不是用引号括起来的“if”。

使用正则表达式无论如何都可以完成吗?或者我将不得不使用传统的编程?

5 个答案:

答案 0 :(得分:2)

尝试以下RegEx(编辑:已修复)。

(?:[^\"]|(?:(?:.*?\"){2})*?)(?: |^)(?<kw>for|while|if)[ (]

注意:由于此RegEx文字包含引号,因此您无法在字符串前使用@符号。请记住,如果您在字符串中添加任何RegEx特殊字符,则需要对它们进行双重转义(例如\ w)。确保在与RegEx匹配时也指定Multiline参数,因此插入符号(^)被视为新行的开头。

这尚未经过测试,但应该可以胜任。如果有任何问题,请告诉我。此外,根据您希望在此处执行的操作,我可能会建议使用标准文本解析(非RegEx),因为根据您要从代码中提取的数据量,它将很快变得更具可读性。希望无论如何都有帮助。

修改 这是一些示例代码,我已经测试过,并且非常有信心它可以正常工作。

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();

希望现在这应该是你的完整解决方案......

答案 1 :(得分:1)

如果您决定使用正则表达式路线,可以use this site来测试正则表达式

答案 2 :(得分:0)

你可以尝试反向引用,它可以让你匹配字符串,但是因为你想要完全相反,你最好转义字符串,这实际上非常简单。

编写匹配字符串的正则表达式并将其替换为空,或者通过跳过引用的字符串并在同一时间查找关键字的文本运行。我认为后者会更有效率。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  

是否可以使用正则表达式完成?

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

考虑这些极端情况:

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

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

// while

/* while */

/* xxx
// xxx */ while

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

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