我是 C# 中正则表达式使用的新手。
我想要一个正则表达式从给定列表中查找下一个关键字,但该关键字没有被引号包围。
例如
如果我有一个如下所示的代码:
while (t < 10)
{
string s = "get if stmt";
u = GetVal(t, s);
for(;u<8;u++)
{
t++;
}
}
我尝试使用正则表达式作为 @"(.*?)\s(FOR|WHILE|IF)\s"
但它给了我“if”作为下一个关键字。
然而,我想将 while 之后的下一个关键字作为“for”而不是用引号括起来的“if”。
可以使用正则表达式来完成吗?或者我必须使用传统编程?
尝试以下正则表达式(Edit: fixed).
(?:[^\"]|(?:(?:.*?\"){2})*?)(?: |^)(?<kw>for|while|if)[ (]
注意:由于此 RegEx 文字包含引号,因此您不能在字符串前使用 @ 符号。请记住,如果将任何 RegEx 特殊字符添加到字符串中,则需要适当地对它们进行两次转义(例如 \w)。确保在与 RegEx 匹配时还指定 Multiline 参数,以便插入符号 (^) 被视为新行的开头。
这尚未经过测试,但应该可以完成工作。如果有任何问题请告诉我。另外,根据您想在这里做的更多事情,我可能建议使用标准文本解析(非正则表达式),因为根据您想从代码中提取多少数据,它将很快变得更具可读性。无论如何希望有帮助。
Edit:这是一些示例代码,我已经对其进行了测试,并且非常有信心它能够按预期工作。
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();
希望这应该是您现在的完整解决方案......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)