6

只有在同一行之前没有特定字符时,如何匹配模式?

我有以下正则表达式代码:

pattern = @"(?<=^|[\s.(<;])(?<!//)(" + Regex.Escape(keyword) + @")(?=[\s.(>])";
replacement = "<span style='" + keywordStyle + "'>$1</span>";
code = Regex.Replace(code, pattern, replacement);

我想添加一个条件以仅在同一行之前没有 2 个斜杠时才匹配(C# 注释)。

我玩弄了它,并修改了模式:

pattern = @"(?<!\/\/)(?<=^|[\s.(<;])(?<!//)(" + Regex.Escape(keyword) + @")(?=[\s.(>])";

但显然,这只有在 2 个斜线是关键字之前的 2 个字符时才有效。

所以这个模式不会匹配“//foreach”,但会匹配“// foreach”。

在这种情况下可以使用负面的后视,或者我可以通过其他方式来完成这个,除了消极的后视吗?

谢谢你。

编辑:

估计我说的不够清楚。重申我的问题:

我正在研究语法高亮,我需要找到 c# 关键字的匹配项,例如“foreach”。但是,我还需要考虑由 2 个斜线定义的注释。如果关键字“foreach”是注释的一部分,我不想匹配它(在同一行之前的任何位置有 2 个斜线。

在这种情况下,否定的lookbehind对我没有帮助,因为斜杠不一定在关键字之前,例如“// some text foreach” - 我不希望这个foreach匹配。

再说一次,我的问题是:如何修改我的模式以仅在同一行上没有两个斜杠的情况下才匹配?

希望我的问题现在很清楚。

4

4 回答 4

4

稍微简化一下你的正则表达式模式,下面的呢?它利用“//”上的非贪婪匹配加上之后的0个或更多字符。

(?<!//.*?)(?<Keyword>foreach)
于 2012-08-12T22:27:25.117 回答
1

在不确切知道您正在尝试什么的情况下,很难说出最佳解决方案,但很可能只是在您尝试使用正则表达式之前检查行首的 //,特别是如果每​​行可能有多个关键字。

于 2012-08-12T19:58:26.690 回答
1

试试这个:

^\s*(?<!//.*)\s*foreach

对于 c# 代码分析,请尝试来自codeplex的可靠且开源的Irony - .NET Language Implementation Kit

于 2012-08-13T05:36:36.623 回答
1

如果您正在使用语法突出显示,您真的应该看看这篇 CodeProject 文章: 用于语法突出显示的快速彩色文本框 这个项目是关于一个代码编辑器窗口,它也进行语法突出显示,它使用正则表达式。也许它可以满足您的需求(也许更多)。似乎这篇文章的作者对语法突出显示做了很多思考。我尝试了你在这里谈到的 foreach,如果它是评论的一部分,我尝试了“foreach”,它显示得很好。

于 2012-08-16T21:54:41.777 回答