regex 用于提取类定义的PowerShell正则表达式

rlcwz9us  于 2023-05-08  发布在  Shell
关注(0)|答案(1)|浏览(222)

使用powershell,我如何编写一个正则表达式,将提取C++类的定义。
这个powershell脚本

$source = 
    "class Node_A {               `n" +
    "public:                      `n" +
    "    Node_A();                `n" +
    "    int foo( int a ) {       `n" +
    "        return a * b;        `n" +
    "    }                        `n" +
    "    int b;                   `n" +
    "};                           `n" +
    "                             `n" +
    "class Node_B {               `n" +
    "public:                      `n" +
    "    Node_B();                `n" +
    "    int foo( int a ) {       `n" +
    "        return a + b;        `n" +
    "    }                        `n" +
    "    int b;                   `n" +
    "};                           "

$to_find = "(?sm)(class Node_. {[^;]+;)"
$source |
    select-string $to_find -AllMatches |
    foreach { $_.Matches } |
    foreach { $_.Value }

会发现这个

class Node_A {
public:
    Node_A();
class Node_B {
public:
    Node_B();

如何使脚本匹配};而不仅仅是;

tzxcd3kk

tzxcd3kk1#

下面的模式将适用于有问题的字符串,尽管如注解中所述,如果你想要一种健壮的方法来提取类,你应该寻找一个C++ AST解析器。值得注意的是,由于这是一个多行正则表达式模式,输入必须是一个多行字符串,否则它将失败。有关模式详细信息,请参见https://regex101.com/r/0AoW8R/1

$source | Select-String '(?ms)^class Node_. \{.+?^\};' -AllMatches |
    ForEach-Object Matches |
    Select-Object Index, Length, Value |
    Format-Table -Wrap

使用所讨论的输入字符串,输出变为:

Index Length Value
----- ------ -----
    0    212 class Node_A {
             public:
                 Node_A();
                 int foo( int a ) {
                     return a * b;
                 }
                 int b;
             };
  270    212 class Node_B {
             public:
                 Node_B();
                 int foo( int a ) {
                     return a + b;
                 }
                 int b;
             };

相关问题