我是 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/