正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

Posted

技术标签:

【中文标题】正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)【英文标题】:Regex match comments (single-line or multiple-line) and match everything else (C#) 【发布时间】:2020-03-24 08:53:49 【问题描述】:

我正在使用 C#,我想匹配 单行 cmets多行 cmetseverything 其他。 例如下面的文字:

/* 
this
is a multiple-line
comment */

this = "is code";

// this is a single-line comment

现在我正在使用这个正则表达式/2(?<single>.*?)$|/\*(?<multiple>.*?)\*/

匹配模式为单行 | 多行

这对匹配 cmets 很好,但它不匹配通用代码。

我试过了:

/2(?<single>.*?)$|/\*(?<multiple>.*?)\*/|(?<code>.*)

匹配代码,但它似乎与其他捕获混淆(我虽然它只会在其他捕获组都不起作用的情况下捕获代码)。

【问题讨论】:

这对您来说已经足够了,只需与评论正则表达式广告分开,您将得到其余的。 我确实明白你的意思;)但我希望他们留在相应的组中......并且 split 不保留组名或者有没有办法? 用合适的工具解析代码,使用专用的C#代码解析器。正则表达式使用起来不安全,在极端情况下肯定会失败。 @xDGameStudios 喜欢@WiktorStribiżew 说:string url = "http://example.com" @WiktorStribiżew 但我不想解析 C# 我想解析一堆使用“自定义”语言(不是由我创建)的文件......而且我不必检查错误,也不编译,也不运行它...我只需要进行一些编辑,例如删除所有 cmets ...或删除所有宏定义或删除宏定义后,如果文本为空,则将文件全部忽略。 【参考方案1】:

这是一个简单的正则表达式,它将匹配多行和单行 cmets(C 风格):((\/[*])([\s\S]+)([*]\/))|([/]2,[^\n]+)

在 C# 中使用它:

int Foo(string haystack) 
    var regex = new Regex(@"((\/[*])([\s\S]+)([*]\/))|([/]2,[^\n]+)", RegexOptions.Compiled);

    var matches = regex.Match(haystack);

    return matches.Count; 

我不太清楚您所说的“匹配其他所有内容”是什么意思,因为这并不是 RegEx 的真正用途 - 您也可以获取整个文本。 您可以(并且可能应该)做的是匹配代码中的 cmets,然后在涉及到代码的其余部分时忽略您的匹配项。

如果您对匹配代码结构感兴趣,则必须为每个结构创建一个正则表达式。 这是 if/else 的一个:(if)|(else) - 然后你可以使用匹配来做任何你想做的事情。 这将匹配字符串(双引号):(["][^"]+["])

也许我误解了您的问题,但如果您只想拆分 cmets,请获取匹配项并忽略其余部分 - 或反转匹配项。

【讨论】:

不。不明白你的意思。 该字符串失败。 在这里测试:regexr.com/4pphs。工作得很好。

以上是关于正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)的主要内容,如果未能解决你的问题,请参考以下文章

java 单行注释 替换为 多行注释

使用正则表达式匹配 Lua 多行字符串和注释

正则表达式匹配 MySQL 注释

正则表达式如何匹配多行的所有任意字符

Vim 多行正则表达式给出重叠匹配

正则如何匹配某字符之后的内容