2017-02-20 11 views
0

私はtxtファイルに次のような正規表現を読み込み、Javaで簡単なプログラム作ってるんだ、問題を抱えている:ベクトルに線を引ける方法はありますか?

Name:{[A-z][0-9]} 
Phone:{[0-9]} 

を私は正規表現の名前を分割する方法を探していますし、

(0) [Name:] 
(1) [Phone:] 

とこのようなこと内容の正規表現は別のベクトル:

(0) [[A-z][0-9]] 
(1) [[0-9]] 

主なアイデアは、NAMを分割されたベクトルの上に置きますe正規表現とtxtアーカイブの行ごとに区切られたベクトルの正規表現ですが、問題はそれがn個のtxtファイルの式です。

例がありますか?

ありがとうございます。

+2

「ベクター」はなぜ特別にしたいですか?これは 'Map'にとってより良い仕事のようです。 –

+0

は良いアイデアだと思われますが、私は正規表現で別のことを行うためにベクターを必要とし、後で正規表現をベクトルの同じ位置にあるJava正規表現に変換します。ありがとうございました –

+0

既存のベクトルの値の型を(型安全性を失うように)変更するのではなく、新しい型を正しい型で作成することをお勧めします。あなたがそうするならば、地図を使うことも同様に働きます。私は私の答えに以下の例を追加しました。 –

答えて

1

2つの平行なベクトルを格納するのではなく、この目的のためにデータ構造Mapを使用することをお勧めします。なんらかの理由でファイルから要素の順序を保持する必要がある場合は、LinkedHashMapを使用できます。例:次に

Map<String, String> regexesByName = new LinkedHashMap<>(); 
for (String line : linesFromFile) { 
    int index = line.indexOf(':'); 
    if (index < 0) { 
    throw new IllegalArgumentException("Cannot parse: " + line); 
    } 
    String name = line.substring(0, index); 
    String regex = line.substring(index + 1); 
    regexesByName.put(name, regex); 
} 

は、すべての名前/正規表現のペアを列挙するために、あなたが行うことができます:

for (Map.Entry<String, String> entry : regexesByName.entrySet()) { 
    // entry.getKey() is the name, entry.getValue() is the regex 
} 

を、与えられた名前のための正規表現をルックアップするために、ちょうど行います

String regex = regexesByName.get(name); 

後で正規表現をコンパイルしたPatternオブジェクトに変換するだけであれば、それも簡単に実行できます。

Map<String, Pattern> compiledRegexesByName = new LinkedHashMap<>(); 
for (Map.Entry<String, String> entry : regexesByName.entrySet()) { 
    compiledRegexesByName.put(
     entry.getKey(), Pattern.compile(entry.getValue())); 
} 
関連する問題