正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)
Posted
技术标签:
【中文标题】正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)【英文标题】:Regex match comments (single-line or multiple-line) and match everything else (C#) 【发布时间】:2020-03-24 08:53:49 【问题描述】:我正在使用 C#,我想匹配 单行 cmets 或 多行 cmets 或 everything 其他。 例如下面的文字:
/*
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#)的主要内容,如果未能解决你的问题,请参考以下文章