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

标签 c# regex

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

例如 如果我有一个看起来像这样的代码:

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

            }

我尝试将正则表达式用作 @"(.*?)\s(FOR|WHILE|IF)\s" 但它给了我“如果”作为下一个关键字。 然而,我想在 while 之后获取下一个关键字作为“for”而不是用引号括起来的“if”。

无论如何都可以使用 Regex 完成吗?或者我将不得不使用常规编程?

最佳答案

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

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

注意:因为此 RegEx 文字包含引号,所以您不能在字符串前使用 @ 符号。请记住,如果您向字符串中添加任何 RegEx 特殊字符,则需要对它们进行适当的双重转义(例如\w)。确保在与 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();

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

关于c# - 正则表达式匹配除 C# 中引号中的字符串以外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/614410/

相关文章:

c# - 内部方法和数据结构。

c# - 如何使用 sevenzipsharp 提取文件

c# - 对 WCF Web API 进行版本控制的最佳方式是什么?

c# - 正则表达式的实现

javascript - 是否验证 3 位数

javascript - 正则表达式排除最后匹配的字符

java - 如何检查 ArrayMap.keySet() 是否包含某个变量+正则表达式?

c# - 发送 String[][] 到 Web 服务

c# - 是否有良好的 API 设计模式将写入与读取分开?

javascript - 使用 javascript 验证时间字符串(最多一小时)