我正在为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来测试表达式。
答案 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]*(.*?)$
没有多行选项?