1

区切り記号付きのキー文字列に基づいてテキスト フィールドの値を見つけるための効率的な Java ソリューション/アルゴリズムはありますか?

例:

ルール:

I. キー: ユーザー名 開始区切り文字: ; 終了区切り文字: ;

キー (この場合はユーザー名) が続き、値が開始区切り文字と終了区切り文字 (この場合は ;) の間にある値を見つける必要があります。

Ⅱ.キー: 開始区切り文字: ; 終了区切り文字: ;

サンプル入力:

ユーザー名が ;suren; のユーザー 2013 年 5 月 2 日木曜日の午後 2 時 30 分にシステムにログインしました。

結果: I. ユーザー名 - スレン II. 2013 年 5 月 2 日(木)午後 2 時 30 分

これまでに試したことの例を次に示します。

String key = "username ";
String startDelimiter = ";";
String endDelimiter = ";";
String computedPattern = "(\\w+)" + key + startDelimiter + "(\\w+)" + endDelimiter;
Pattern p = Pattern.compile(computedPattern);
Matcher m = p.matcher(
  "A user with username ;suren; logged into the system on ;Thu May 2, 2013 2:30pm;");
while( m.find() ) {
  System.out.println( "Key:" + m.group(1) + "Value:" + m.group(2) );
}
4

1 に答える 1

3

あなたのアプローチの問題は、正規表現の構築から生じます。Pattern Classの Java Docs を見ると、\w単語の文字だけに一致することがわかります。[a-zA-Z_0-9]

定義されたキーの後のセミコロン間の任意の文字と、その間の任意の数字を一致させたいだけのようです。これに適したパターンは次のとおりです。

ArrayList<String> keys = new ArrayList<String>();
keys.add("username");
keys.add("on");
String startDelimiter = ";";
String endDelimiter = ";";
String searchStr = "A user with username ;suren; logged into the system on ;Thu May 2, 2013 2:30pm;";       
for (String key : keys) {
    Pattern p = Pattern.compile("("+key+")[ ]+?"+startDelimiter+"([^;]+)"+endDelimiter);
    Matcher m = p.matcher(searchStr);   
    while( m.find() ) {
        System.out.println("Key: "+m.group(1)+" Value: "+m.group(2));
    }
}

[^;]+とは異なる文字を持つ空でない文字シーケンスに一致するため、文字クラスはあなたに代わって仕事をします";"

于 2013-05-21T13:44:13.053 に答える