正则表达式:匹配所有内容除了样式中的注释://或(* ... *)

时间:2014-01-24 10:40:03

标签: regex regex-negation

我正在玩RegEx,但我绝不是专业人士而且我无法在http://www.regexr.com/中正常使用它 (急于求成......)

我有二十几个“.ST”文件,基本上是PLC代码,似乎与C语法类似。所以所有评论都是//或(* ... *)

我是翻译,我应该只翻译评论,所以我的想法是在Notepad ++中使用查找/替换并找到所有不是评论的内容,将其替换为空白,以便在结束,有一个只有评论的文件。所以我不知道如何处理与评论匹配的RegEx,因为我不想删除那些并且不能用任何东西“替换”它......有意义???

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

这将匹配以//:

开头的任何行

^\/\/.*$


这将匹配*和*之间的任何内容:

\*[^\*]*\*

答案 1 :(得分:0)

简单回答

不是你要求的,但我相信这就是你想要做的。您只需捕获注释并将其删除即可。要做到这一点:

~(?<!\\)//[^\n\r]*|(?<!\\)\(\*.*?(?<!\\)\*\)~sg

将选择该行上//后面的所有文字,以及(* *)中所有文字(多行)。之后,您只需要用空字符串""替换所有选择。

有关信息,我们会看到(?<! )模式:它们是为了确保评论的限制不会被转义。 \//I wanna keep this code不应匹配,code (*foo\*)bar*)应选择(*foo\*)bar*)

疯狂矫枉过正[不应该使用]

为了记录,并且因为当有一个简单明显的答案而且因为我没有在那之前看到太长时间而去寻找那些可怕的正则表达式真是太诱人了......你不应该< / strong>使用此。

~(?:^//.*$|\(\*.*?\*\)|([^(\n]+)|(\())~mg

可能会在变量\1\2中找到您想要的内容。

^//.*$捕获以//开头的行(尽管您可能还希望在类似//的行中的cool code //this was cool code之前捕获代码)

\(\*.*?\*\)捕获(* *)之间的任何内容(但如果有换行符则不会...如果你的正则表达式支持它,你可以使用(?s:\(\*.*?\*\))。它可能不是速度优化的)

([^(\n]+])查找(并选择)此线上不是左括号的任何内容。这意味着未注明评论的多行代码将被分割成行。您可以使用(?s:((?:(?!\n/|\().)+))等内容更改此行为。

(\()匹配停止上一个模式的左括号,前提是它不是(*注释的开头。

你可以在这里看到它:http://regex101.com/r/aX6sF7,但我相信它可以大大简化。