Неожиданное поведение при попытке использовать String.split ("\\?") - PullRequest
18 голосов
/ 11 ноября 2010

Итак, у меня есть строка, подобная этой:

"Some text here?Some number here"

, и мне нужно разделить их, я использую String.split("\\?"), но если у меня есть строка, подобная этой:

"This is a string with, comma?1234567"

У меня это тоже разделено запятой (,).И если у меня есть эта строка:

"That´s a problem here?123456"

Она также разделяется на ´, так как я могу это исправить?

Ответы [ 3 ]

57 голосов
/ 11 ноября 2010

Я не вижу такого поведения: (и не ожидал бы)

String s ="hello?1000";

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

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

Выходы:

привет

1000

Введение запятой "," или апострофом "" не имеет никакого значения для разделения:

String s ="he,llo?1000";

Выходы:

он, LLO

1000

String s ="he'llo?1000";

выходы:

he'llo

1000

Разлитый также отлично работает, если у вас есть пробелы во входной строке. Я могу только предположить, что ваше регулярное выражение не то, что вы думаете!

0 голосов
/ 11 ноября 2010

это решение: (РЕДАКТИРОВАТЬ: это еще проще)

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()));
    }

}
0 голосов
/ 11 ноября 2010

Похоже, типичная проблема регулярных выражений. Я использую это, например, для разделения

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;
...