2010-12-28 7 views
0

私が進めているシステムでは、変更したいと思うレガシーコードがいくつかありますが、できません。オブジェクト・マップは、セミコロンが続いていないことをJavaでRegexを使用してマップ文字列を分割する方法

userId: "929290"; name: "Donnie Darko"; obj : {field1: "field"; field2: "field2"} phone: "666-6666"; 

お知らせしますが、他のすべてのキー/値のペアは次のとおりです。このコードは、以下の文字列のように見えるマップの値を記憶しています。 Javaで正規表現を使用して、私が持っていることができるように、このマップの最初のレベルを得るためにそこに道がある:

userId: "929290" 
obj : {field1: "field"; field2: "field2"} 

私は最初のレベルのみをしたい、私が個別にフィールド1とフィールド2を解析するために探していませんよ。

答えて

1

ないユースケースの確認が、ここであなたはそれ

Pattern userIdPattern = Pattern.compile("^userId:\\s*\"(\\d+)\";.*$"); // will be the userId number 
Pattern objPattern = Pattern.compile(".*(obj\\s*:\\s*\{[^\}]+\}).*"); //will be the JSON object inside 
Matcher userIdMatcher = userIdPattern.matcher("userId: \"929290\"; name: \"Donnie Darko\"; obj : {field1: \"field\"; field2: \"field2\"} phone: \"666-6666\";"); 
if(userIdMatcher.find()){ 
    System.out.println("userId : " + .group(1)); 
} 
Matcher objPatternMatcher = objPattern.matcher("userId: \"929290\"; name: \"Donnie Darko\"; obj : {field1: \"field\"; field2: \"field2\"} phone: \"666-6666\";"); 
if(objPatternMatcher.find()){ 
    System.out.println(objPatternMatcher.group(1)); 
} 
+1

私が言及すべきは、正規表現を使用してネスト階層をトラバースすることは物理的に不可能であるということです。 'obj'の下にネストされたJSONオブジェクトがある場合、それは機能しません。あなたはこれに対処する正規表現を変更することができますが、すべてのレベルを下げる必要があります。 –

0

JSON文字列のように見える...あなたはJSONを使用することができます:)ここ

+0

実際には近いですが、十分に近くはありません。マップよりもリストのほうが多く、JSONとして解析しようとすると爆発するでしょう。 – stevebot

+1

@stevebot簡単な文字列の置き換えによって、有効なjsonを得ることができます。 – marcog

+0

これらの文字列の置換は、データを取得するためにRegexだけでも十分に複雑なものになります。 – stevebot

1

を見つけるのに役立つ正規表現は、あなたが考えたことがありますされていますANTLRを使用していますか?これは、正規表現よりはるかに強力な言語認識プログラムです。そうすれば、コンポジットフィールド(例えば、{field1: {field3:"field3"; field4="field4"}; field2: "field2"})を扱うことができます。学習曲線は正規表現を学習するよりも急です。私の意見では、ANTLRの学習はそれに値するものです。

+1

実際に適切な解釈が必要な場合は、antlrは確かに行く方法です。 –

関連する問題