2

いくつかのシェルコマンドからの出力を処理するCプログラムがあります。'ps'については、次の5つのフィールドに関心があります。必要なフィールドを名前で指定し、glib正規表現エンジンのパターンを作成してから、結果を解析して処理します。

読み取り可能で保守可能なコードを生成するフィールド、パターン、およびフォーマット/タイプを整理するための良い方法はありますか?私がこれまでに持っているものは機能しますが、あまりよく見えません。私はOSXで開発していますが、後で他のプラットフォームに移植したいと思います。

また、C#の@文字列演算子のような動作を取得して、パターンのバックスラッシュの半分を削除する方法はありますか?

ありがとう。

const char field_pid[] = "pid";
const char field_lstart[] = "lstart";
const char field_ruser[] = "ruser";
const char field_cputime[] = "cputime";
const char field_command[] = "command";

char pattern[] = "\\s*(?<pid>\\d+)\\s+(?<lstart>\\w+\\s+\\w+\\s+\\d+\\s+[\\d:]+\\s+\\d+)\\s+(?<ruser>\\w+)\\s+(?<cputime>[\\d:\\.]+)\\s+(?<command>.+)";

// Do the regex match.
...

// Extract the matching strings.
gchar *pid = g_match_info_fetch_named(match_info, field_pid);
gchar *lstart = g_match_info_fetch_named(match_info, field_lstart);
gchar *ruser = g_match_info_fetch_named(match_info, field_ruser);
gchar *cputime = g_match_info_fetch_named(match_info, field_cputime);
gchar *command = g_match_info_fetch_named(match_info, field_command);

// Parse and process the strings.
...
4

1 に答える 1

1

ここにいくつかの改善オプションがあります:

  • このオプションを使用してG_REGEX_EXTENDED、パターンをコンパイルします。これにより、パターン内の空白が無視され、行末#までコメントを導入するために使用できます。

  • 正規表現をいくつかの行に分割します。

  • Cソースから取得するのではなく、外部ファイルから正規表現を読み取ります。(このためのユーティリティ関数を作成するか、glibの構成読み取りメカニズムを使用できます。)これが、バックスラッシュ炎を治療する唯一の方法です。

最後の提案を除いて、結果の正規表現は次のようになります。

const char *pattern = "\
\\s*                                  \
(?<pid> \\d+ ) \\s+                   \
(?<lstart> \\w+ \\s+ \\w+ \\s+ \\d+ \\s+ [\\d:]+ \\s+ \\d+) \\s+    \
(?<ruser> \\w+) \\s+                  \
(?<cputime> [\\d:\\.]+) \\s+          \
(?<command> .+)                       \
"

まだ完璧にはほど遠いですが、最初から読んだものよりもはるかに読みやすくなっています。

于 2013-03-18T20:29:50.000 に答える