正则表达式 - 负向后瞻在任何行中

6

如何只匹配某个模式,如果在同一行上它前面没有特定的字符?

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

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

我希望添加一个条件,只有在同一行中没有两个斜杠的情况下才匹配(C#注释)。

我试着修改了这个模式:

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

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

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

在这种情况下,可以使用负回顾前瞻吗?或者我可以通过其他方式实现这一点,而不使用负回顾前瞻吗?

谢谢。

编辑:

我可能没有表达清楚。再次重申我的问题:

我正在进行语法高亮,并需要找到c#关键字的匹配项,比如"foreach"。然而,我还需要考虑注释,即由2个斜线定义的注释。如果它是注释的一部分(同一行上任何位置有2个斜线),我就不想匹配关键字"foreach"。

负回顾前瞻不能帮助我解决这个问题,因为斜杠不一定会紧挨着关键字,例如"// some text foreach" - 我不希望这个foreach被匹配。

所以,我的问题是:如何修改我的模式,只有在同一行上没有2个斜线在关键字之前时才匹配?

希望我的问题现在已经清楚了。


我希望这不是一个XY问题 - L.B
可能是这样-因此我的问题是“...或者我可以用其他方法完成这个任务”。所以,你有什么想法这种情况下的Y会是什么? :) - Rivka
1
或者我能用其他方法实现这个吗?你想要实现什么?你的真正问题是什么? - L.B
1
Roslyn项目C#和VB.NET代码搜索器-使用Roslyn,这些是 X 的答案 :) - L.B
你的思路有误。在语法高亮器中,一旦任何规则完成对给定文本段的标记,其他规则就不应再次查看它。如果类似关键字的东西出现在注释或字符串文字中,你的“关键字”规则甚至不应该看到它。它应该已经被“注释”或“字符串文字”规则处理过了。 - Alan Moore
谢谢L.B.,我是C#和VB.NET代码搜索器 - 使用Roslyn的作者...顺便说一下,该工具可以搜索.NET代码,但我还使用了一个带有语法高亮功能的编辑器。在CodeProject文章http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting中,有一些很好的语法高亮示例。 - woutercx
4个回答

5
简化你的正则表达式,下面这个如何?它利用了“//”后面的非贪婪匹配以及0个或多个字符。
(?<!//.*?)(?<Keyword>foreach)

这对我有用 - 谢谢。最终结果:pattern = @"(?<!//.*?)((?<=^|[\s.(<;])(?<!//)(" + Regex.Escape(keyword) + @")(?=[\s.(>]))"; - Rivka
@Rivka:我很高兴这对你有用。如果你需要转换到另一个RegEx引擎,请注意一个小细节:并非所有引擎都支持在lookbehind表达式中使用正则表达式。.NET支持,但据我所知,Perl不支持。 - David Andres
好知道(虽然不打算在不久的将来更改)-谢谢! - Rivka
1
尝试使用module_line=re.compile(r'(?<!//.*?)module')来处理另一个类似的应用程序。但是出现了错误:error: look-behind requires fixed-width pattern。如果我删除.*,则错误消失。我们该如何解决这个问题?(在Ubuntu 16.04 LTS中使用Python re进行尝试)。 - vineeshvs

1

如果你正在使用语法高亮功能,你应该看一下这篇CodeProject文章:Fast Colored TextBox for Syntax Highlighting。这个项目是关于一个代码编辑器窗口,它也可以进行语法高亮,并且使用了正则表达式。也许它可以满足你的需求(甚至更多)。似乎作者在语法高亮方面考虑得非常周到。我尝试了你在这里提到的foreach,以及如果它是注释的一部分,它也可以很好地显示。


我查看了这篇文章的源代码,看起来确实投入了很多工作。不过我想自己去学习一下,而不是使用已经构建好的程序,因为这对我来说是一个学习过程(而且现在有点超出我的需求范围)。不过这是一个很好的参考,谢谢。 - Rivka

1

如果不知道你要尝试什么,很难说出最佳解决方案,但最有可能的是,在尝试正则表达式之前,先检查行首是否有//,特别是如果一行中可能有多个关键字。


1

这些工具可以用于进行C#代码分析:http://www.ndepend.com/Doc_CQLinq_Syntax.aspx 或者 http://www.codeproject.com/Articles/408663/Using-NRefactory-for-analyzing-Csharp-code - woutercx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接