引用符で囲まれたテキストをJavaへの文字列として解析する簡単な方法はありますか?私はこのような行を解析する必要があります:
author="Tolkien, J.R.R." title="The Lord of the Rings"
publisher="George Allen & Unwin" year=1954
そして私が欲しいのは、弦としてのトールキン、JRR、指輪物語、ジョージ・アレン&アンウィン、1954年です。
引用符で囲まれたテキストをJavaへの文字列として解析する簡単な方法はありますか?私はこのような行を解析する必要があります:
author="Tolkien, J.R.R." title="The Lord of the Rings"
publisher="George Allen & Unwin" year=1954
そして私が欲しいのは、弦としてのトールキン、JRR、指輪物語、ジョージ・アレン&アンウィン、1954年です。
次のような正規表現を使用できます
"(.+)"
引用符の間の任意の文字に一致します。Java では次のようになります。
Pattern p = Pattern.compile("\\"(.+)\\"";
Matcher m = p.matcher("author=\"Tolkien, J.R.R.\"");
while(matcher.find()){
System.out.println(m.group(1));
}
group(1) が使用されていることに注意してください。これは 2 番目の一致であり、最初の group(0) は引用符付きの完全な文字列です。
もちろん、部分文字列を使用して最初と最後の文字を除くすべてを選択することもできます。
String quoted = "author=\"Tolkien, J.R.R.\"";
String unquoted;
if(quoted.indexOf("\"") == 0 && quoted.lastIndexOf("\"")==quoted.length()-1){
unquoted = quoted.substring(1, quoted.lenght()-1);
}else{
unquoted = quoted;
}
ファンシーな人々やファンシーなプログラマーが好んで使用するファンシーなパターン正規表現のナンセンスなものがいくつかあります。
String.split() を使用するのが好きです。これは単純な機能であり、必要なことを実行します。
したがって、文字列がword: "hello"
あり、「こんにちは」を取り出したい場合は、次のように簡単に実行できます。
myStr = string.split("\"")[1];
これにより、引用符に基づいて文字列がビットに分割されます。
より具体的にしたい場合は、次のことができます
myStr = string.split("word: \"")[1].split("\"")[0];
そのように私はそれを切っword: "
て"
もちろん、 がword: "
2 回繰り返されると問題が発生します。これがパターンの目的です。特定の質問について、その問題に対処する必要はないと思います。
また、 のような文字には注意してください。と 。Split は正規表現を使用するため、これらの文字はおかしな動作を引き起こします。"\\"
=\
はそれらの面白い規則から逃れることができると思います。私が間違っている場合は、誰かが私を修正してください。
頑張ってください!
ドキュメントが整形式であり、構文エラーが含まれていないと推測できますか?もしそうなら、String.split()を使用した後、他のすべてのトークンに関心があるだけです。
より堅牢なものが必要な場合は、Scannerクラス(またはStringBufferとforループ;-))を使用して、「どこかに引用符が表示された」以外の追加の基準を考慮して、有効なトークンを選択する必要があります。
たとえば、引用符で文字列を盲目的に分割するよりも堅牢なソリューションが必要になる場合があります。おそらく、引用符で始まる引用符が等号の直後にある場合にのみ有効なトークンです。または、引用符で囲まれていない値と引用符で囲まれた値を処理する必要がありますか?\"
エスケープされた引用符として処理する必要があります。そうでない場合は、文字列の終わりとしてカウントされます。一重引用符または二重引用符(例:html)を使用できますか、それとも常に二重引用符で正しくフォーマットされますか?
堅牢な方法の1つは、コンパイラのように考え、Javaベースのレクサー(JFlexなど)を使用することですが、それは必要なものにはやり過ぎかもしれません。
低レベルのアプローチを好む場合は、whileループを使用して、入力ストリームを文字ごとに繰り返すことができます。="
エスケープされていない別の文字が見つかるまで、文字をStringBufferにコピーし始めたら"
、さまざまな必要なものに連結します。解析された値、またはそれらをある種のリストに追加します(データで何をする予定かによって異なります)。次に、開始トークン(例:)に再び遭遇するまで読み続け="
、繰り返します。