【问题标题】:Unexpected behaviour when trying to use String.split("\\?")尝试使用 String.split("\\?") 时出现意外行为
【发布时间】:2011-05-08 11:32:06
【问题描述】:

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

"Some text here?Some number here"

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

"This is a string with, comma?1234567"

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

"That´s a problem here?123456"

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

【问题讨论】:

  • 能否将文本示例放在代码块中,以便我们区分问题和示例?
  • 你需要将一个字符串分成几个字符吗?那么,字符串 "test1?test2,test3" 变成了 "test1", "test2", "test3"?
  • 你用的是什么版本的java?我不明白这个问题.....
  • (我怀疑有java版本会显示你的问题......)

标签: java string split


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在我的其他解决方案中,针对此类问题给出了更通用的答案
    【解决方案3】:

    看起来像一个典型的正则表达式问题。 例如,我正在使用它来拆分

    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;
    

    【讨论】:

    • 实际上正则表达式是您的解决方案的问题:
    • \\?不是问号,而是更多符号的正则表达式
    • @michael:问号被转义(注意 \\ 之前的?)。双反斜杠用于转义而不是单反斜杠,因为它是 Java 源代码中的字符串文字。
    • 查看我的另一个答案,这是针对此问题的更简单的解决方案(也为您测试过)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多