我是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”。
使用正则表达式无论如何都可以完成吗?或者我将不得不使用传统的编程?
答案 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#这样复杂的语言需要专门的解析器。