Java で文字列を解析するさまざまな方法には何がありますか?[閉まっている]
質問
プレーヤーのコマンドを解析するために、私は最も頻繁に使用しました。 スプリット 文字列を区切り文字で分割し、一連の文字列によって残りを計算する方法 if
または switch
エス。Java で文字列を解析するさまざまな方法にはどのようなものがありますか?
解決
コマンドインターフェイスをできるだけ寛容なものにしようとしていると思います。この場合は、次のようなアルゴリズムを使用することをお勧めします。
- 文字列を読み取る
- 文字列をトークンに分割する
- 辞書を使用して同義語を一般的な形式に変換する
- たとえば、「打つ」、「パンチ」、「打つ」、「蹴る」をすべて「打つ」に変換します。
- 順序付けされていない包括的なベースに基づいてアクションを実行する
- 順序なし - 「猿の顔面をパンチする」は「顔面をモンキーパンチする」と同じです。
- 包括的 - コマンドが「猿の顔を殴る」はずなのに「猿を殴る」と入力された場合、これが一致するコマンドがいくつあるかを確認する必要があります。コマンドが 1 つだけの場合は、このアクションを実行します。コマンドの優先順位を設定し、一致した場合でも最上位のアクションを実行することも良いでしょう。
他のヒント
私は正規表現がとても好きです。コマンド文字列が非常に単純である限り、手動で解析するには数ページのコードが必要となる可能性があるいくつかの正規表現を作成できます。
チェックアウトすることをお勧めします http://www.正規表現.info 正規表現の入門書として、また Java の具体的な例についてはこちらをご覧ください。
手動で解析するのはとても楽しいです...初めに:)
実際には、コマンドがそれほど洗練されていない場合は、コマンド ライン インタープリターで使用されるものと同じ方法で扱うことができます。使用できるライブラリのリストは次のとおりです。 http://java-source.net/open-source/コマンドライン. 。から始めてもいいと思います Apache Commons CLI または args4j (注釈を使用します)。これらは十分に文書化されており、使い方は非常に簡単です。これらは解析を自動的に処理するため、必要なのはオブジェクト内の特定のフィールドを読み取ることだけです。
より高度なコマンドがある場合は、正式な文法を作成する方がよいでしょう。グラフィカルエディタ、デバッガ、文法用のインタプリタを備えた非常に優れたライブラリがあります。それは呼ばれています アントラー (そして編集者 ANTLRWorks) しかも無料です:) 文法の例やチュートリアルもいくつかあります。
私は見ます Javaの移行 の ゾーク, 、そしてシンプルなものに傾きます 自然言語プロセッサ (トークン化または正規表現によって駆動される) 次のような (このリンクから):
public static boolean simpleNLP( String inputline, String keywords[]) { int i; int maxToken = keywords.length; int to,from; if( inputline.length() = inputline.length()) return false; // check for blank and empty lines while( to >=0 ) { to = inputline.indexOf(' ',from); if( to > 0){ lexed.addElement(inputline.substring(from,to)); from = to; while( inputline.charAt(from) == ' ' && from = keywords.length) { status = true; break;} } } return status; }
...
私の本では、プログラマが Zork をもう一度見るきっかけとなるものであれば何でも良いですが、Grues には気を付けてください。
...
Sun 自体は、StringTokenizer を避け、代わりに String.spilt メソッドを使用することを推奨しています。
Pattern クラスにも注目してください。
ANTLR/ANTLRWorks にもう一票。ファイルの 2 つのバージョンを作成し、1 つは実際にコマンドを実行するための Java コードを含むもの、もう 1 つは含まない (文法のみ) と、言語の実行可能な仕様を作成することになります。これはテストに最適であり、ドキュメント化にも役立ちます。移植することにした場合は、大幅な時間の節約になります。
これがコマンドラインを解析する場合は、使用することをお勧めします コモンズ CL.
Apache Commons CLI ライブラリは、コマンド ライン インターフェイスを処理するための API を提供します。
試す JavaCC Java 用のパーサー ジェネレーター。
言語を解釈するための機能が多数あり、Eclipse でも十分にサポートされています。
@CodingTheWheelこれがあなたのコードです。少しクリーンアップしてEclipseを介して(Ctrl+シフト+f) そしてここに挿入し直してください:)
各行の前にある 4 つのスペースを含みます。
public static boolean simpleNLP(String inputline, String keywords[]) {
if (inputline.length() < 1)
return false;
List<String> lexed = new ArrayList<String>();
for (String ele : inputline.split(" ")) {
lexed.add(ele);
}
boolean status = false;
to = 0;
for (i = 0; i < lexed.size(); i++) {
String s = (String) lexed.get(i);
if (s.equalsIgnoreCase(keywords[to])) {
to++;
if (to >= keywords.length) {
status = true;
break;
}
}
}
return status;
}
スペースに対する単純な文字列トークナイザーは機能するはずですが、これを行う方法は本当にたくさんあります。
トークナイザーを使用した例を次に示します。
String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;
if (tokens.hasMoreTokens()) {
action = tokens.nextToken();
}
if (action != null) {
doCommand(action, tokens);
}
その後、トークンを引数にさらに使用できます。これはすべて、引数にスペースが使用されていないことを前提としています...そのため、独自の単純な解析メカニズム (最初の空白を取得してその前のテキストをアクションとして使用する、または速度の低下を気にしない場合は正規表現を使用するなど) をロールアウトして、使用できるように抽象化することもできます。どこでも。
コマンドの区切り文字列が常に同じ文字列または文字 (「;」など) である場合は、StrinkTokenizer クラスを使用することをお勧めします。
ただし、区切り文字が異なる場合や複雑な場合は、正規表現を使用することをお勧めします。正規表現は、1.4 以降、String クラス自体、メソッド分割で使用できます。java.util.regex パッケージの Pattern クラスを使用します。
言語が単純な場合
動詞名詞
その後、手で分割するとうまくいきます。
より複雑な場合は、ANTLR や JavaCC などのツールを実際に検討する必要があります。
ANTLR (v2) のチュートリアルは次の場所にあります。 http://javadude.com/articles/antlrtut それがどのように機能するかがわかります。
Jコマンダー まだテストしていませんが、かなり良さそうです。
テキストに区切り文字が含まれている場合は、 split
方法。
テキストに異なる形式を意味する不規則な文字列が含まれている場合は、次を使用する必要があります regular expressions
.
Split メソッドは、文字列を指定された部分文字列式の配列に分割できます。 regex
。その引数は次の 2 つの形式です。スプリット (String regex
) と分割 (String regex, int limit
)、分割 (String regex
)実際には、split (String regex, int limit) を呼び出して実現します。 限界は0です. 。そして、 制限> 0 そして 限界 <0 何を表していますか?
とき jk 説明しました:いつ 制限> 0 サブ配列の長さは制限までです。つまり、可能であれば、 限界-1 サブディビジョン、部分文字列として残ります(制限 1 回の文字の文字列の分割端を除く)。
限界 <0 配列の長さに制限がないことを示します。
制限 = 0 文字列の末尾の空の文字列は切り捨てられます。StringTokenizer
クラスは互換性上の理由から、従来のクラスとして保存されているため、String クラスの Split メソッドを使用するようにしてください。参照する リンク