Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 与C#include文件匹配的正则表达式_Regex - Fatal编程技术网

Regex 与C#include文件匹配的正则表达式

Regex 与C#include文件匹配的正则表达式,regex,Regex,我需要一些帮助来匹配C include文件的完整路径,如下所示: #include <stdio.h> -> stdio.h #include "monkey/chicken.h" -> monkey/chicken.h #include->stdio.h #包括“猴子/鸡.h”->猴子/鸡.h 到目前为止,我已经(根据我发现的另一个表达进行了改编): ^\s*\\包含\s+([“']) 但是,我在这一点上有点卡住了-在第二种情况下它不匹配,我不确定如何返回匹配结

我需要一些帮助来匹配C include文件的完整路径,如下所示:

#include <stdio.h>  -> stdio.h
#include "monkey/chicken.h" -> monkey/chicken.h
#include->stdio.h
#包括“猴子/鸡.h”->猴子/鸡.h
到目前为止,我已经(根据我发现的另一个表达进行了改编):

^\s*\\包含\s+([“'])
但是,我在这一点上有点卡住了-在第二种情况下它不匹配,我不确定如何返回匹配结果,例如返回regcomp()的文件路径

顺便说一句,我看过regexplib.com,但没有找到合适的


编辑:是的,我是一个完全的regexp新手,与regmatch\u t和朋友一起使用POSIX regex…

你可以试试这个regex:

(^\s*\#\s*include\s*<([^<>]+)>)|(^\s*\#\s*include\s*"([^"]+)")
(^\s*\\\\s*包含\s*)(^\s*\\\\s*包含\s*([^“]+)”)
对于
#包括



#包括“”

这将提供更好的结果:

^\s*\#include\s+["<]([^">]+)*[">]
^\s*\\包括\s+[“]
然后,当您获得匹配时,您需要查看第一个捕获组

你没有说你在使用哪种语言,你提到regcomp()的因素让我相信你在使用C中的POSIX regex库。如果这是正确的,那么你想使用regexec函数并使用nmatch和pmatch参数来获得第一个捕获组。

我写了以下内容:

#include ((<[^>]+>)|("[^"]+"))
#包括((]+>)|(“[^”]+”)

它合适吗?

测试得不是特别好,但它符合您的两种情况:

^\s*#include\s+(<([^"'<>|\b]+)>|"([^"'<>|\b]+)")

^\s*#include\s+(事情是,结果可能在捕获组2或3中,因此您应该检查2是否为空,然后使用3…与其他一些答案相比,它的优点是它不会匹配以下内容:#include“bad.h>或此:#include如果您想要更精确的解决方案,允许在include文件之前添加注释,例如

  /* ops, a comment */ /* oh, another comment */   #include  "new_header1.h" /* let's try another with an #include "old_header.h" */
是:

^(?::\s*\/\*.?\*\/)\s*.\35;包括\s*(?:(?:)(?:)(?:)(?:)(?:)(?:)(?:)(?:)(*)
这对我很有用:

'\#include\s*(<([^"<>|\b]+)>|"([^"<>|\b]+)")'

\\\35; include\s*(嘿!我不匹配
\\35; include“bad.h>
!:(a)对不起,没有看到你的答案。b)您的将例如match#include You's right,但我通常反对使用regex进行过于精确的验证。对于类似的情况,我只需要获取.h的字符串,使用任何标准函数来检查它是否是有效的文件路径。是的,也很简单。我可能会对空格进行调整以使其更加健壮。谢谢!建议使用“(]+>)'以更好地识别另一个术语的和类似项。否则,
#include//a>b
会获取错误的信息。您也可以使用非捕获括号吗?这取决于正则表达式库。@乔纳森当然可以使用非捕获括号…这是什么?顺便说一句,我编辑了正则表达式,ty=)我怎样才能得到头文件的名称?像在#include中一样,我只想提取“stdio.h”,注意,“#”和“include”之间可以有空格。还要注意,还有第三种形式:#include MACRONAME。MaRONAMED必须扩展为“或”或“某物”。“中间”一词的复数字符类排除了第二种情况,即“中间是不包含的”。“
——很久以前,第二个可能出现在PRIMOS的C语言中。Jonathan:是的,我突然意识到这并不是严格基于标准的,但我认为包含双引号或大于号的文件名很少出现在野外(而C源文件/头文件似乎属于文件命名范围中“不那么奇怪的垃圾”端)。
  /* ops, a comment */ /* oh, another comment */   #include  "new_header1.h" /* let's try another with an #include "old_header.h" */
^(?:\s*|\s*\/\*.*?\*\/)\s*#include\s*(?:(?:<)(?<PATH>.*?)(?:>)|(?:")(?<PATH>.*?)(?:"))
'\#include\s*(<([^"<>|\b]+)>|"([^"<>|\b]+)")'