0

最初は: タイトルで申し訳ありませんが、それ以上は知りませんでした。また、私は正規表現にかなり慣れていません。

私は現在、アイテム/武器の名前を(ゲームから)分析できる小さなものをプログラミングしています。

次のような名前を一致させたいと思います。

Windwalkers angry Leather Claws of Destruction

次の一致グループで:

  1. ウィンドウォーカー
  2. 怒り
  3. 革の爪
  4. 破壊

アイテム名には命名スキームがあります。

<> = required, [] = optional
[itemgroup] [adjective] < material name with spaces > [of [source]]

グループ、形容詞、およびソースにはスペースが含まれません。

私はこれを思いつきました:

(\w*) (\w*) (.+) of (.*)

これは、一部のパーツがオプションであることをまったく処理しません。また、一致グループが常に同じままであれば素晴らしいことです。そのため、2 は常に形容詞であり、空白になる可能性があります。

ご協力いただきありがとうございます。

4

4 に答える 4

2

これを 1 行のパーツに分割できます。

String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");

必要なだけ形容詞を追加できます。

これは、否定的な後読みを使用して、分割されるスペースの前に形容詞がないことを表明します。オプション(of )?は、用語間の「の」を消費します。


ここにテストがあります:

String str = "Windwalkers angry Leather Claws of Destruction";
String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");
System.out.println(Arrays.toString(parts));

出力:

[Windwalkers, angry, Leather Claws, Destruction]
于 2013-08-20T22:57:20.527 に答える
1

次の正規表現は、あなたが求めている値を与えるはずです:

  ^(\w* )?(\w* )?(\w* \w*) of (\w*)$

ここでの唯一の重要な仮定は、アイテム名 ('Leather Claws') に 1 つだけのスペースがあるということです。そうでない場合、正規表現を使用してこれが可能になるとは思いません。とはいえ、質問で言及されていない固定文法がない限り、自動パーサーでその状況を処理するのは難しいでしょう

入力: Windwalkers angry Leather Claws of Destruction

出力:

  1. ウィンドウォーカー
  2. 怒り
  3. 革の爪
  4. 破壊

入力: Windwalkers Leather Claws of Destruction

出力:

  1. ウィンドウォーカー
  2. <空白>
  3. 革の爪
  4. 破壊

入力: Leather Claws of Destruction

出力:

  1. <空白>
  2. <空白>
  3. 革の爪
  4. 破壊

これらはあなたの質問から確認できた唯一のテスト ケースですが、それらはすべて正しく解析され、同じ一致グループも保持されます。

http://www.rubular.com/r/7AT4kDVf8Sでデモを参照してください。

于 2013-08-21T08:56:34.003 に答える
0
\[([a-z A-Z]*)\]\s\[([a-z A-Z]*)\] <(.*)\>\s\[of\s\[([a-z A-Z]*)\]\] 

これが正規表現パターンです。あなたが話していたオプション部分については少し混乱していますが、 | の使用について 私が提供したウェブサイトと一緒にあなたを助けることができるかもしれません。

() はグループと呼ばれ、それらからコンテンツを解析します。

このウェブサイトは正規表現に驚くべきものです!

http://www.debuggex.com/

編集:オプションのセクションでは、正規表現のさまざまなパターンを作成し、1 つが失敗した場合は、別のパターンに適合する別のパターンに一致するようにします。

于 2013-08-20T23:34:58.713 に答える