尝试使用String.split时出现意外行为(" \\?")

时间:2010-11-11 13:29:22

标签: java string split

所以我有一个像这样的字符串:

"Some text here?Some number here"

我需要拆分它们,我正在使用String.split("\\?"),但如果我有这样的字符串:

"This is a string with, comma?1234567"

我也把它分成了逗号(,)。如果我有这个字符串:

"That´s a problem here?123456"

它也会在´上分裂,那么我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:55)

我没有看到这种行为:(我也不期望)

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

如果输入字符串中有任何空格,溢出也可以正常工作。我只能建议你的正则表达式不是你想象的那样!

答案 1 :(得分:0)

看起来像典型的正则表达式问题。 我正在使用它来分割

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;

答案 2 :(得分:0)

这是解决方案:(编辑:它甚至更简单)

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

}