日記/2016-08-31
2016-09-03 (土) 14:32:18
雑記:アイテム名切り出し、その後。†
雑記:アイテム名切り出し、その後。
表記件、いろいろ考えた結果、それなりに軽く・リーズナブルな解決ができそう。
とりあえず、メモ的に残す。
[+]→続きを読む。
[-]
昨日の日記に書いた内容を概念的に整理すると。
現状『単純な書式切り出し』で取り出せるアイテム名は、論理的に以下のような形式になる。
精練 頭1 頭2 ‥ 頭n 名称 尾1 尾2 ‥ 尾n S
- 個々のブロックごとの間は、半角スペース区切り。
- ブロックごとの意味は、以下の通り。
- 精練:精練ボーナス。+1 などの "+n" 書式固定。 存在しないこともある。存在するときは必ず1つだけ。
- 頭n:接頭文字。カード起因でつく。
「マリシャス」「ブルータル」など。
可変長、もちろん無いこともある。 - 名称:アイテム名そのもの。これは絶対にある。
- 尾n:接尾文字。「カード」もしくは「エンチャント」起因で付与される。
「オブ アンダー ア キャスト」「<int2>」など。
可変長。- さらに、同じ強化が複数刺さった場合の「ダブル」「トリプル」といったものがある。
これは接頭・接尾の両方に出現しうる。 - カード起因でつく接頭・接尾では、カード1枚で複数のブロックが発生することもある。 上記「アンダー ア キャスト」はまさにその例:カード1枚で4ブロックになっている。
- さらに、同じ強化が複数刺さった場合の「ダブル」「トリプル」といったものがある。
- S:スロット。装備のスロット数に応じて [1][2]など。
スロットが無いものにはそもそもつかないことも。
で。
アイテム名として切り出したいのは、上記表現で言うところの『名称 S』の2ブロックだけ。
そして冷静に考えると、尾n 部分だけ削除することができれば、機械的に切り出しができそう。
精練 頭1 頭2 ‥ 頭n 名称 S
・・・ね。文字列の最後が『名称 S』になっているんだから、単純にスペース区切りで『後ろ側2ブロック』を切り出せばいい。
また、スロットなしのアイテムでは、カード起因の接尾はつかない。
ただし、<int 1>形式のエンチャントはありうる。
これらを総合的に考えると、以下のようなステップで必要な名称が取り出せる。
- 入力文字列に対して、正規表現 "<.*?> " にマッチする部分を削除する。
- これは "<任意文字列> " 形式にヒットする正規表現。つまり、エンチャント類を削除する。
- さらに、正規表現 "^\+[1-9] " にマッチする部分を削除する。
- これは、「文字列先頭にある」 "+n " 形式にヒットする正規表現。つまり精練部分を削除する。
- さらにもう1つ、"ダブル |トリプル |クワドラプル "も削除。
- これは接頭・接尾の両方に出現しうるが、どちらも削除できる。
- 入力文字列に "[" が含まれるかどうかチェックする。
- もし含まれていない場合、これは「スロットなし装備」あるいは「ただのアイテム」。
この時点で加工済みの入力文字列は『名称』形式になっているはず。- なぜならば:もしこれが「スロットなし装備」だった場合、スロットがないのでスロット起因の接頭・接尾はつかない。
精練およびエンチャント形式はすでに削除したので、もはや接頭・接尾はないはず。
- なぜならば:もしこれが「スロットなし装備」だった場合、スロットがないのでスロット起因の接頭・接尾はつかない。
- もし含まれていない場合、これは「スロットなし装備」あるいは「ただのアイテム」。
- 入力文字列に "[" が含まれている場合、スロットあり装備。
これに対して「装備に付き得る接尾語」を正規表現削除する。
- 例えば『オブ アンダー ア キャスト』など。
- 上記接尾語削除が終われば、残っているのは『頭1 ‥ 頭n 名称 S』形式。
後ろ側2ブロックを取り出すことで、『名称 S』を取得できる。
このやり方をすることで、単純に『接頭語』タイプの文字列削除を考えなくてよくなるので、かなり項目が減る。
正確に数えたわけではないが、経験的に、カードによって付与される文字は接尾よりも接頭のほうが圧倒的に多いので。
ご意見などがあれば。
- 情報メモ。
・重量効率があるので、重量も必要
-- ともせ%管理人。 2016-09-03 14:32:18 (土)