1

次のようなコンテンツがあります。

    author = "Marjan Mernik  and Viljem Zumer",
    title = "Implementation of multiple attribute grammar inheritance in the tool LISA",
    year = 1999

    author = "Manfred Broy and Martin Wirsing",
    title = "Generalized
             Heterogeneous Algebras and
             Partial Interpretations",
    year = 1983

    author = "Ikuo Nakata and Masataka Sassa",
    title = "L-Attributed LL(1)-Grammars are
             LR-Attributed",
    journal = "Information Processing Letters"

そして、 titleの二重引用符ですべてをキャッチする必要があります。私の最初の試みはこれでした:

^(" "|\t)+"title"" "*=" "*"\"".+"\","

これは最初の例をキャッチしますが、他の 2 つをキャッチしません。もう一方には複数の行があり、それが問題です。\n次のように、複数の行を許可するためにどこかに変更することについて考えました:

^(" "|\t)+"title"" "*=" "*"\""(.|\n)+"\","

しかし、これは役に立ちません。代わりに、すべてをキャッチします

私よりも、「私が欲しいのは二重引用符の間です。別のものが見つかるまですべてをキャッチするとどうなりますか?このようにして、行数に関係なく、タイトルの最後にいるかどうかを知ることができました"。これ:,

^(" "|\t)+"title"" "*=" "*"\""[^"\""]+","

しかし、これには別の問題があります... 上記の例にはありませんが、タイトル宣言"の間に二重引用符 ( ) を入れることができます。例えば:

title = "aaaaaaa \"X bbbbbb",

はい、常にバックスラッシュ ( \) が前に付きます。

この正規表現を修正するための提案はありますか?

4

2 に答える 2

2

二重引用符で囲まれた文字列に一致する従来の正規表現は次のとおりです。

\"([^\"]|\\.)*\"

あなたの場合、あなたはこのようなものが欲しいでしょう:

"title"\ *=\ *\"([^\"]|\\.)*\"

PS:IMHO、正規表現に引用符を入れすぎているので、読みにくいです。

于 2010-03-26T23:53:40.893 に答える
0

開始条件を使用して、個別のパターンを単純化できます。次に例を示します。

%x title
%%
"title"\ *=\ *\"  { /* mark title start */
  BEGIN(title);
  fputs("found title = <|", yyout);
}

<title>[^"\\]* { /* process title part, use ([^\"]|\\.)* to grab all at once */
  ECHO;
}

<title>\\. { /* process escapes inside title */
  char c = *(yytext + 1);
  fputc(c, yyout); /* double escaped characters */
  fputc(c, yyout);
}

<title>\" { /* mark end of title */
  fputs("|>", yyout);
  BEGIN(0); /* continue as usual */
}

実行可能ファイルを作成するには:

$ flex parse_ini.y
$ gcc -o parse_ini lex.yy.c -lfl

それを実行します:

$ ./parse_ini < input.txt 

どこinput.txtにある:

author = "Marjan\" Mernik  and Viljem Zumer",
title = "Imp\"lementation of multiple...",
year = 1999

出力:

author = "Marjan\" Mernik  and Viljem Zumer",
found title = <|Imp""lementation of multiple...|>,
year = 1999

'"'タイトルの周りがに置き換えられ'<|'、 タイトル'|>'. Also内の '\"'` が '""' に置き換えられます。

于 2010-03-27T03:23:26.080 に答える