使用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\,]+)/