Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
使用C#Regex查找C++;代码模式(定义和EMUN) 我编写C++程序,运行C++源文件,查找以下内容: #define SOMETHING_A 99_C#_C++_Regex - Fatal编程技术网

使用C#Regex查找C++;代码模式(定义和EMUN) 我编写C++程序,运行C++源文件,查找以下内容: #define SOMETHING_A 99

使用C#Regex查找C++;代码模式(定义和EMUN) 我编写C++程序,运行C++源文件,查找以下内容: #define SOMETHING_A 99,c#,c++,regex,C#,C++,Regex,及 及 我的目标是获得以下配对列表作为输出: {SOMETHING_A,99} {EX_A,0} {EX_B,1} .. .. {EX2_A,0} {EX2_B,1} .. .. 你能帮助我找到与上述3种模式匹配的正确正则表达式吗?< p>如果你想要一个对任何C++文件都有效的解决方案,使用解析器而不是正则表达式。有太多的可能性需要考虑(不同的代码样式、注释掉的代码等等) 如果您只想在一组已知的文件上执行此操作,并且这些文件具有可预测的格式和样式,那么正则表达式可能就可以了。实际上,最好使用几

我的目标是获得以下配对列表作为输出:

{SOMETHING_A,99}
{EX_A,0}
{EX_B,1}
..
..
{EX2_A,0}
{EX2_B,1}
..
..

<>你能帮助我找到与上述3种模式匹配的正确正则表达式吗?

< p>如果你想要一个对任何C++文件都有效的解决方案,使用解析器而不是正则表达式。有太多的可能性需要考虑(不同的代码样式、注释掉的代码等等)

如果您只想在一组已知的文件上执行此操作,并且这些文件具有可预测的格式和样式,那么正则表达式可能就可以了。实际上,最好使用几个正则表达式:

/^#define\s+(\S+)\s+(\S+)/
这只匹配位于行首的define语句

以下是typedef枚举:

/^\s*typedef\s+enum\s*\{[^\}]+\}[^;]+;/
(不清楚你想从这张照片中得到什么,所以我还没有抓到任何东西)

这是枚举。这最好分两步进行:

/^\s*enum\s+(\S+)\s*\{\s*([^\}]+?)\s*\}\s*;/
第一步获取第一个捕获组中的枚举名和第二个组中的内容。对第二个捕获组执行正则表达式以获取字段和值:

/(\S+)\s*=\s*([^\s\,]+)/
每个匹配项都将为您提供一个名称/值对

<>这些正则表达式应该处理你的例子,并且他们应该在处理C++代码中最常用的用法方面做得体面。但它们并不完美;如果您想要一个涵盖所有可能构造的解决方案,请不要使用正则表达式


注意:当使用这些时,你必须确保关闭。

我可以看到,你想在这里解析C++代码。我建议使用解析器来做这件事。C++有很多怪癖和方法,你最好用一个合适的C++解析器。我会尽快找到这些模式。它们隐藏在大量文件之间的代码中。我尝试过:MatchCollection matches=Regex.matches(input,@“^#define\s+(\s+)\s+(\s+),RegexOptions.Singleline);结果什么都没有:(@ItayB,不,单行必须关闭:)好的,正确的,在C#中是RegexOptions.Multiline。这是工程的定义-现在我正在检查动车组。。。我将再次简短地评论我尝试了emuns解决方案的前两种模式。。但我们能找到一种模式同时抓住它们吗?枚举名称对我来说并不重要,稍后我将解析结果以获取EMUN的值。。。。我只在乎里面的内容brackets@ItayB,我更喜欢使用两个正则表达式的简单性。这个问题有足够的复杂性,不需要尝试组合成一个表达式就可以解决。不过,我想您可以这样做:
/^\s*(?:typedef\s+)?enum(?:\s+\w+)\s*{\s*([^\}]+?)\s*}[^;]*/
/^\s*enum\s+(\S+)\s*\{\s*([^\}]+?)\s*\}\s*;/
/(\S+)\s*=\s*([^\s\,]+)/