0

C コードでは、パターンがファイルの少なくとも 1 行で一致するかどうかを確認する必要があります。式にキャレットが必要です。私が持っているものは次のとおりです。

const char *disambiguate_pp(SourceFile *sourcefile) {
        char *p = ohcount_sourcefile_get_contents(sourcefile);
  char *eof = p + ohcount_sourcefile_get_contents_size(sourcefile);

        /* prepare regular expressions */
        pcre *re;
        const char *error;
        int erroffset;
        re = pcre_compile("^\\s*(define\\s+[\\w:-]+\\s*\\(|class\\s+[\\w:-]+(\\s+inherits\\s+[\\w:-]+)?\\s*{|node\\s+\\'[\\w:\\.-]+\\'\\s*{)",
                          PCRE_MULTILINE, &error, &erroffset, NULL);

        for (; p < eof; p++) {
                if (pcre_exec(re, NULL, p, mystrnlen(p, 100), 0, 0, NULL, 0) > -1)
                        return LANG_PUPPET;

        }
        return LANG_PASCAL;
}

何らかの理由で、次の行が正規表現に一致するため (そしてすべきではない)、キャレットは無視されているように見えます。

  // update the package block define template (the container for all other

私は多くのことを試しましたが、これを機能させることができませんでした。私は何を間違っていますか?

4

3 に答える 3

1

を使用する場合はPCRE_MULTILINE、バッファ全体を 1 つの文字列として渡すと、文字列のどこかに一致があるかどうかがわかります。ループは不要であるだけでなく、forバ​​ッファーの中間の位置を渡すと、PCRE が文字列の先頭 (したがって、行の先頭) を見ていると誤って認識させます。

于 2012-05-26T10:05:03.273 に答える
0
于 2012-05-26T09:14:39.790 に答える
0

記録のために、@tripleee の回答を使用しました。これが最終的なコードです。

const char *disambiguate_pp(SourceFile *sourcefile) {
        char *p = ohcount_sourcefile_get_contents(sourcefile);
  char *eof = p + ohcount_sourcefile_get_contents_size(sourcefile);

        /* prepare regular expressions */
        pcre *re;
        const char *error;
        int erroffset;
        re = pcre_compile("^\\s*(define\\s+[\\w:-]+\\s*\\(|class\\s+[\\w:-]+(\\s+inherits\\s+[\\w:-]+)?\\s*{|node\\s+\\'[\\w:\\.-]+\\'\\s*{)",
                          PCRE_MULTILINE, &error, &erroffset, NULL);

        /* regexp for checking for define and class declarations */
        if (pcre_exec(re, NULL, p, mystrnlen(p, 10000), 0, 0, NULL, 0) > -1)            
                return LANG_PUPPET;

        return LANG_PASCAL;
}
于 2012-05-26T11:10:22.497 に答える