正则表达式简化 - 组太多了

时间:2011-04-07 18:27:21

标签: c# regex regex-group

我正在为C-Style预处理器编写一个简单的文本抓取器。输入文本(示例):

#if 1 > 0
blah
#if defined MACRO1
blah blah blah
#if !defined MACRO2
blaaaah
#if      !   defined MACRO3
blah?

我想捕获每个#if [!] defined语句后面的文本。我需要从上面的文本输出:

MACRO1
MACRO2
MACRO3

此处需要捕获的行号为3,5和7.请注意,第7行的空格与制表符混合。

我尝试创建可以给我这个结果的表达式,但没有一个如此出色。我给出所需结果的表达式是 -

(?<=(?<=(?<=(?<=(?<=(?<=#if)[\s\t]+)!?)[\s\t]*)defined)[\s\t]+).*

使用的选项有:Multiline + IgnoreCase

但我确信这不优雅,简洁。 有人可以建议更好的表达吗?

PS - 我正在使用Expresso来测试表达式。

4 个答案:

答案 0 :(得分:1)

这个正则表达式怎么样?

#if[\s\t]+[!]?[\s\t]*defined[\s\t]*(.*)

在反向引用中你会得到MACRO1 / MACRO2 / MACRO3。

答案 1 :(得分:1)

这应该有效     鉴于s包含你的问题中的输入与换行符等

foreach(var match in Regex.Matches(s, @"(?<=#if\s*!?\s*defined\s*)(?<macro_name>\w+)")) {
  Console.WriteLine(match);
}

将发现MACRO01,MACRO02和MACRO03为3次捕获

答案 2 :(得分:0)

Ay Nayan

我知道您需要获取所有“#if defined”和“#if!defined”预处理器指令的宏引用名称,这些指令位于通用c源代码文本流中...

我可以建议你那个简单的正则表达式

^#if\s*!?\s*defined\s*(\w*).*$

以前的正则表达式只定义了一个捕获组(\ w *),以便只获取宏名称。

捕获组将填充所有宏名称出现。

* PS:必须使用多行+忽略大小写选项执行正则表达式。我使用RegExr工具http://gskinner.com/blog/archives/2008/03/regexr_free_onl.html *

测试了那个

答案 3 :(得分:0)

这是否有效,

^#if(?:[ \t]*!)?[ \t]*defined[ \t]*(.*?)$

没有多行选项?