1

C 構造体の定義に一致する正規表現が必要です。これは私のターゲットデータです:

typedef struct
{
}dontMatchThis;

typedef struct
{
  union //lets have a union as well
  {
    struct 
    {
     int a
     //a comment for fun

     int b;
     int c;
    };
    char byte[10];
  };
}structA;

typedef から strunctA まで、structA の定義のみを一致させたいと考えています。

私が試してみました : typedef[\s\S]+?structA

しかし、貪欲でない修飾子を使用していますが、これは両方の構造に一致しています。助言がありますか

4

4 に答える 4

1

問題は、正規表現が一致を開始するポイントです。最初の typedef で一致が正しく開始され、structA まで続行されます。

あなたがやろうとしていることは本当に難しいです(正しく行うことは不可能だと思います)。構造体が停止する場所を確認するには、ネストされた中括弧を一致させる必要があります。

正規表現ベースのパーサーの構築を参照してください。

于 2013-05-10T15:25:39.300 に答える
0

ctn で述べられているように、正規表現で述べられている貪欲でない修飾子の問題は、 の最初の定義を探し始め、typedef見つかった最初の場所で停止することstructAです。間にあるものはすべて有効と見なされます。正規表現を使用して問題を解決する方法は、構造体を識別する正規表現を定義し、後で別の段階で、一致が必要な構造体に対応するかどうかを確認することです。

たとえば、次の正規表現を使用します。

(typedef[\s\S]+?})\s*([a-zA-Z0-9_]+)\s*;

2 つのグループを定義します。最初のグループは atypedefで始まり、中かっこで終わります。貪欲でないテキスト マッチングを使用します。この最初のグループには、必要な文字列が含まれています。最後の中括弧の後に構造体名が続き、 .([a-zA-Z0-9_]+)で終わり;ます。あなたの例を考えると、それぞれが2つのグループを含む2つの一致があります。

マッチ 1:

(typedef struct
{
})(dontMatchThis);

グループ 2 の値: dontMatchThis

マッチ 2:

(typedef struct
{
  union //lets have a union as well
  {
    struct 
    {
     int a
     //a comment for fun

     int b;
     int c;
    };
    char byte[10];
  };
})(structA);

グループ 2 の値: structA

したがって、グループ 2 の値が structA に対応するかどうかが検証の問題になります。

于 2016-12-27T16:34:39.993 に答える
0

私は次の作品を見つけました:

([\s\S])(typedef([\s\S])?structA)

次に、構造体を含む 2 番目のグループを選択します。これは、最初の [\s\S] を貪欲演算子として使用して、ターゲット構造体の前のすべての定義に一致させます。

于 2013-05-13T07:43:25.110 に答える