次の形式の文字列があります。
{'var1':var2}
var1とvar2が両方とも文字列変数になるように、この文字列を解析することができました。ただし、最初に「:」から分割し、次にデータを抽出するために、複数の文字列トークナイザー呼び出しが必要です。
では、これを行うのに最適なもの(コードの最小行)は何でしょうか?
2 つの値を含む配列だけが必要な場合は、部分文字列を抽出して "':" で分割することにより、2 行で行うことができます。最終的には次のようになります。
s = s.substring(2, s.length()-1);
String[] sarr = s.split("':");
本当に 1 行のコードが必要な場合は、次のように組み合わせることができます。
String[] sarr = s.substring(2, s.length()-1).split("':");
これは一般的なケースでは解決できません。たとえば、次のことを考慮してください。
ケースa)
var1 =
:':':
var2 =
':'
完全な元の文字列は
{':':':':':'}
ケースb)var1 =
:
var2 =
':':':'
完全な元の文字列は
{':':':':':'}
したがって、「より多くの情報」が必要です。要件/ユースケースに応じて、あいまいさを回避するか、文字列に制限を設けるか、文字列をエスケープ/エンコードする必要がありました。
これはうまくいくはずです:
String yourstring = "{'var1':var2}";
String regex = "\\{'(.+)':(.+)}";
Matcher m = Pattern.compile(regex).matcher(yourstring);
String var1 = m.group(1);
String var2 = m.group(2);
編集:コメンテーター向け:
弦:
{'this is':somestring':more stuff:for you}
出力:
var1 = this is':somestring
var2 = more stuff:for you
PS: Perl でテスト済みです。Java は手元にありません。申し訳ありません。
編集:ユーザー不明が指摘するように、Java 正規表現エンジンは{
エスケープされていないようです。逃げた。
(壊れやすい - コメントを参照) のようなもの:
// 3 lines..
String[] parts = "{'var1':var2} ".trim().split("':");
String var1 = parts[0].substring(2,parts[0].length);
String var2 = parts[1].substring(0,parts[1].length-1);
正規表現を使用できます:
String re = "\\{'(.*)':(.*)}";
String var1 = s.replaceAll (re, "$1");
String var2 = s.replaceAll (re, "$2");
開始をマスクする必要があり{
ます。そうしないと、 java.util.regex.PatternSyntaxException: Illegal repeat が発生します。