我是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”。
可以使用Regex来完成吗?还是我将不得不使用常规编程?
最佳答案
尝试以下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();
希望这应该是您现在的完整解决方案...
关于c# - 正则表达式可以匹配除C#中引号之外的所有字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/614410/