web-dev-qa-db-ja.com

String.split( "\\?")を使用しようとしたときの予期しない動作

だから私はこのような文字列を持っています:

_"Some text here?Some number here"
_

それらを分割する必要がある場合は、String.split("\\?")を使用していますが、次のような文字列がある場合:

_"This is a string with, comma?1234567"
_

私もそれをコンマ(_,_)で分割しました。そして、私がこの文字列を持っている場合:

_"That´s a problem here?123456"
_

_´_でも分割されます。これを修正するにはどうすればよいですか?

19
fredcrs

私はこの振る舞いを見ていません:(私はそうすることも期待していません)

String s ="hello?1000";

String[] fields = s.split("\\?");

for (String field : fields) {
   System.out.println(field);
}

利回り:

こんにちは

1000

コンマ "、"やアポストロフィ "'"を導入しても、分割に違いはありません。

String s ="he,llo?1000";

収量:

こんにちは

1000

String s ="he'llo?1000";

収量:

こんにちは

1000

入力文字列にスペースがある場合も、こぼれたものは正常に機能します。私はあなたの正規表現があなたが思っているものではないことを示唆することができるだけです!

57
Richard H

これが解決策です:(編集:さらに簡単です)

public static Pair<String,String> getSplittedByQuestionMark(String term){
    String[] list=term.split("[?]");
    return new Pair<String,String>(list[0],list[1]);
}

私はそれをテストしました:

@Test
public void testGetSplittedByQuestionMark(){
    ArrayList<String> terms=new ArrayList<String>();
    ArrayList<Pair<String,String>> expected=new ArrayList<Pair<String,String>>();
    terms.add("test?a");
    terms.add("test?20");
    terms.add("test, with comma?ab10");
    expected.add(new Pair<String,String>("test","a"));
    expected.add(new Pair<String,String>("test","20"));
    expected.add(new Pair<String,String>("test, with comma","ab10"));
    for(int i=0;i<terms.size();i++){
        Pair<String,String> answer = StringStandardRegex.getSplittedByQuestionMark(terms.get(i));
        assertTrue("answer="+answer.getFirst(),answer.getFirst().equals(expected.get(i).getFirst()));
        assertTrue("answer="+answer.getSecond(),answer.getSecond().equals(expected.get(i).getSecond()));
    }

}

[以下のコメントの後に編集]テストを追加しましたが、何が問題なのかわかりません。これも機能します(さらに簡単です)。

@Test
public void testGetSplittedByQuestionMarkNotUsingRegex(){
    ArrayList<String> terms=new ArrayList<String>();
    ArrayList<Pair<String,String>> expected=new ArrayList<Pair<String,String>>();
    terms.add("test?a");
    terms.add("test?20");
    terms.add("test, with comma?ab10");
    expected.add(new Pair<String,String>("test","a"));
    expected.add(new Pair<String,String>("test","20"));
    expected.add(new Pair<String,String>("test, with comma","ab10"));
    for(int i=0;i<terms.size();i++){
        String[] answer=terms.get(i).split("\\?");
        assertTrue("answer="+answer[0],answer[0].equals(expected.get(i).getFirst()));
        assertTrue("answer="+answer[1],answer[1].equals(expected.get(i).getSecond()));
    }

}
2
michel.iamit

典型的な正規表現の問題のように見えます。私はこれを例えば分割するために使用しています

name (code)

名前とコードを分けたペアに:

RE regex = new RE("(.*) \\W(.*)\\W");
if(!regex.match(term)){
    throw new InvalidArgumentException("the given term does not match the regelar expression:'NAME (ID)'");
}
Pair<String,String> pair=new Pair<String,String>(regex.getParen(1),regex.getParen(2));
return pair;
0
michel.iamit