2017-03-22 2 views
1

私はちょうど文字列からかなり少数の単語の最もゆったりした意味で、「解析された」正規表現であるいくつかのコードを見直しました。正規表現マッチャーで型付きのグループを返す方法がないのはなぜですか?

簡単な例である:

'3 4 5 .....というように' と一致する必要があり
^([0-9]{1}) ([0-9]{2}) ([0-9]{1}) .... and so on$ 

、私は間違っていない場合。

文字列でチェックされている数値の量と、私が参照している場合の文字列の複雑さのために、実際には正規表現が一致する可能性があります数字を抽出しようとするときには、コードの作者は、マッチャーグループでは、次の方法に公正少数の呼び出しを行うために持っていた: -

Integer.parseInt(matcher.group(index)) 

正規表現エンジンが明示的に捕獲するように指示されている場合グループに0-9(1-2)しか含まれていない場合、正しいタイプを明示的に取り込み、再び解析しないようにする方法はありませんか?この場合、正規表現を使用せずにパターンを一致させるべきかどうかは、パターンの複雑さに依存しますか?おそらく、正規表現グループのマッチャーの仕組みについての私の理解は、完全ではありません。

これを他の言語でもサポートしていますか?

軽量のparseIntを実装すると、エラーチェックブランチがなくてもパフォーマンスの最後のビットを絞り出す傾向がある場合はパフォーマンスが少し改善されると思います。 parseIntメソッドを見ると、正規表現マッチの後に必要ではないかもしれないエラーチェック用のブランチがかなりあります。

+1

これは、マッチャーの動作方法です。スティングイン - ストリングアウト。それを取るか、それを解析してください。 –

+0

Integerの呼び出しが嫌いな場合は、解析を行うオブジェクトにマッチャーをラップすることができます。すべての場所でparseInt –

+1

またはそれに応じて単一のグループを抽出することができますあなた自身の流暢型の正規表現マッチャーを構築;-) – Roland

答えて

1

好きなことをすることができるルーチンやクラスは使いやすいかもしれませんが、柔軟に使用することができます。ここでの設計問題は、の関心事の分離であり、独立して変更できる情報はプログラム内で分離されるべきであるという原理。

正規表現パーサの懸案事項は、入力文字列のセクションを期待パターンの要素に識別することです。これらの文字列セクションを他のJavaデータ型に変換することは別の問題です。確かに、([0-9]*)と一致するグループはとなる可能性があります。(ただしこれはあまり知られていません)は数値型で最もよく表現されますが、数値型はどれですか?型変換は別々に行うことができます。

プログラム設計では、入力文字列を複雑なデータ型に変換する可能性があります。それを単一のクラスまたはメソッドにカプセル化することができます。そのため、プログラムの残りの部分は単一のステップになります。しかし、あなたのために十分にあなたの要件を予想することは、Javaプラットフォームにとって実用的ではありません。

1

あなたがマッチするものに適したタイプを決めることは、レキシカル分析(コンパイラ作成の最初のステップの1つ)の一部であり、正規表現エンジンの仕事ではありません。レキシカル分析を行うツールは、レクサーまたはトークナイザと呼ばれます。

字句解析を行う場合は、StreamTokenizer in Javaがありますが、かなり制限されています。レクサーが必要だった場合は、プロジェクトに応じてJFlexなどを使用するか、自分のロールを使用します。

関連する問題