- PR -

文字列の解析について

投稿者投稿内容
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-11-19 11:59
<key>=<value>,<key>=<value>, ...

となっている文字列を解析して、
Mapクラスのインスタンスに
keyとvalueを追加していきたいと思っています。
* ","および"="は、
エスケープ処理をして文字列中に含まれている可能性があります。

そこで実現方法として以下を考えてみました。
1)String#split()を使う
2)parserをつくる
3)その他

しかし、以下のような問題があります。
1)エスケープ処理を加えた文字列は区切り文字からはずす、
ということができない。
2)コードが複雑になる

なるべくシンプルな実装にしたいのですが、
何かよい方法はないでしょうか。

* 環境はJDK5.0です。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-11-19 12:12
split()は使えないですね。普通に1文字ずつ読むパーザを書いても、さほど大きなコードにならないと思いますよ。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-11-19 13:33
3)その他
正規表現を駆使してみたら割とシンプル?逆に複雑?

サンプルコードを書いてみましたが、テストが不十分です。
コード:
	String data = "<key>=<value>,<key>=<>,<\\>escape\\<>=<va\\,lue>";
	Scanner s = new Scanner(data);
	while(null!=s.findInLine("<((?:[^>]|\\\\>)*)>=<((?:[^>]|\\\\>)*)>")){
	    System.out.println(s.match().group(1)+":"+s.match().group(2));
	}

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-19 13:51
引用:

なるべくシンプルな実装にしたいのですが、
何かよい方法はないでしょうか。


実装をシンプルにしたいのであれば、
解析対象の文字列のルールをシンプルにすべきです。
エスケープなんてルールを入れなければよいのです。

ただ、要求される文字列のパーサを書いても、
そんなに複雑にならないかと思います。
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-11-19 14:02
スフレさん ////////////////////////////////////////

おっしゃる通り、parserをつくったところで
さほど大きなコードにはならないと思っています。
ただ、正規表現などで処理できれば数行で済ませられるので
それと比較して複雑かどうか
という意味でした。

///////////////////////////////////////////////////

Rayさん ///////////////////////////////////////////

ありがとうございます。
せっかくサンプルを呈示していただいたのですが、
こちらの表記があいまいなために誤解を招いた点があります。

<key>=<value>,<key>=<value>, ...
というのは、具体的には
key1=value1,key2=value2,key3=value3
のような文字列のことです。

///////////////////////////////////////////////////


かつのりさん //////////////////////////////////////

おっしゃる通りだと思います。
ただ、今回は文字列のルールは決定事項で変更できないのです。
///////////////////////////////////////////////////
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-19 14:07
引用:

84さんの書き込み (2007-11-19 11:59) より:
* ","および"="は、
エスケープ処理をして文字列中に含まれている可能性があります。


引用:

84さんの書き込み (2007-11-19 11:59) より:
* 環境はJDK5.0です。


(アスタリスクは、デコレーションなのですね。)
カンマとイコールの2種類が問題なのですよね。
エスケープはどのような方式でしょうか?
C や Java のように \ などを前置するのが単純ですが、それ以外の方式だと途端に複雑になります。
\ の前置ならば、パースも、
(1) \ の対処
(2) = と , の対処
を独立してできるので処理も楽です。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-19 14:10
引用:

84さんの書き込み (2007-11-19 14:02) より:
ただ、正規表現などで処理できれば数行で済ませられるので
それと比較して複雑かどうか
という意味でした。


私はあまり正規表現は好きではないので、多少、行数がかかっても for や if で切り分けて行くほうが良いと思います。
正規表現は、結局は JavaScript でテトリスを10行でコーディングする、みたいなトリッキーなものになってしまい、行数は少なくても複雑さは少なくならないと思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-11-19 14:13
unibonさん

> (アスタリスクは、デコレーションなのですね。)
はい、その通りです。
記述がわかりにくくなってしまい、すいません。

> エスケープはどのような方式でしょうか?
= -> \=
というような\前置方式です。

[ メッセージ編集済み 編集者: 84 編集日時 2007-11-19 14:14 ]

スキルアップ/キャリアアップ(JOB@IT)