2016-04-13 6 views
2

ログファイルパーサーを簡略化し、は複雑な正規表現をテンプレートエンジンに置き換えます。この考え方は、テンプレートエンジンのプロセスを逆にして、テンプレートの説明と有効な結果ファイルを入力として与えることです。解析するテンプレートエンジンはありテンプレートエンジンを使用してJavaの複数行ログファイルを解析する

*** ID: {{string}} *** 
- type: {{string}} 
- time-stamp: {{date}} 

* Device: XKK-{{integer}} 

:それらのすべてが同じ構造を持ち、擬似テンプレート言語で記述することができ

*** ID: X821 *** 
- type: B5 
- time-stamp: 20160202T01:11:01.2991 

* Device: XKK-255141 

:複数行のログファイルは次のようになりログファイルを作成し、テンプレートファイル内の構造をルックアップし、HashMap/List/Objectにコンテンツを返しますか?

注: 私はANTLRで簡単なDSLを書くことができたことを知っています。しかし、ここでの考え方は、解析を単純化し、再帰を伴わない基本的な複数行ログファイルだけがサポートされることを受け入れることです。

答えて

1

が、私はこれを行い、既存のテンプレートエンジン(彼らは通常のデータとテンプレートを埋め、周りに他の方法で作業)を認識していないです。 "シンプル" マルチラインの正規表現についてどのように

ReverseTemplateEngine rte = new ReverseTemplateEngine(
    "*** ID: $ ***", 
    "- type: $", 
    "- time-stamp: $", 
    "* Device: XKK-$"); 

List<String> result = rte.parse(new BufferedReader(
    new FileReader("yourfile.txt"))); 
+0

ステファン、コードを共有してくれてありがとう!これは、問題を解決するためのかなりスマートな方法です。 –

-1

多くのものがあります。

YAMLJSONを確認してください。彼らは本当に使いやすいです。

唯一の問題は、各テンプレート言語の形式に従わなければならないことです。

これらの言語でファイルを作成する方法は次のとおりです。

YAML

-- YAML 
ID : X821 
type : B5 
time-stamp : 2016-02-02 01:11:01.2991 
Device : 
- XKK : 255141 

JSON

{ 
    "__comment" : "JSON", 
    "ID": "X821", 
    "type": "B5", 
    "time-stamp": 20160202T01:11:01.2991, 
    "Device": { 
     "XKK": 255141 
    } 
} 
+1

入力ファイルを解析し、そのフォーマットを変更しないとします。 –

1

class ReverseTemplateEngine { 
    ArrayList<String> prefixes = new ArrayList(); 
    ArrayList<String> suffixes = new ArrayList(); 

    public ReverseTemplateEngine(String... templates) { 
    for (String s: templates) { 
     int cut = s.indexOf("$"); 
     suffixes.add(s.substring(0, cut)); 
     prefixes.add(s.substring(cut + 1); 
    } 
    } 

    public List<String> parse(BufferedReader r) { 
    ArrayList<String> result = new ArrayList<>(); 
    while (true) { 
     String line = reader.readLine(); 
     for (int i = 0; i < prefixes.length; i++) { 
     if (line.startsWith(prefixes.get(i)) 
      && line.endsWith(suffixes.get(i)) { 
      result.add(line.substring(prefixes.get(i).length(), 
         line.length() - suffixes.get(i).length())); 
      break; 
     } 
     } 
    } 
    return list; 
    } 
} 

は使用方法:

なぜ、このようなものを使用していませんか?

String test = 
    "*** ID: X821 ***\n" + 
    "- type: B5\n" + 
    "- time-stamp: 20160202T01:11:01.2991"; 

java.util.regex.Pattern p = java.util.regex.Pattern.compile(
    "^\\*\\*\\* ID: (\\S+) \\*\\*\\*\\s+" + 
    "- type: (\\S+)\\s+" + 
    "- time-stamp: (\\S+)", 
    java.util.regex.Pattern.MULTILINE); 

java.util.regex.Matcher m = p.matcher(test); 
if(m.find()) { 
    System.out.println("ID = " + m.group(1)); 
    System.out.println("type = " + m.group(2)); 
    System.out.println("time = " + m.group(3)); 
} 

それはので、バックスラッシュとワイルドカードエスケープの書き込みに少し厄介だが、それはトリックを行い...(このロジックの上に簡単にあなたのテンプレートマッチング文字列をマップする文字列変換を書くことができますあなたがしたいならば、正規表現に)。

関連する問題