Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用String.split(“\\?”)时出现意外行为_Java_String_Split - Fatal编程技术网

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

Java 尝试使用String.split(“\\?”)时出现意外行为,java,string,split,Java,String,Split,我有一个字符串,如下所示: "Some text here?Some number here" "This is a string with, comma?1234567" 我需要拆分它们,我使用的是String.split(\\?”),但是如果我有这样一个字符串: "Some text here?Some number here" "This is a string with, comma?1234567" 我也用逗号(,)将其拆分。如果我有这个字符串: "That´s a probl

我有一个字符串,如下所示:

"Some text here?Some number here"
"This is a string with, comma?1234567"
我需要拆分它们,我使用的是
String.split(\\?”)
,但是如果我有这样一个字符串:

"Some text here?Some number here"
"This is a string with, comma?1234567"
我也用逗号(
)将其拆分。如果我有这个字符串:

"That´s a problem here?123456"

它也会在
'
上拆分,因此如何解决此问题?

看起来像是一个典型的正则表达式问题。 我用这个例子来分割

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;
RE regex=new RE((.*)\\W(.*)\\W);
如果(!正则表达式匹配(术语)){
抛出新的InvalidArgumentException(“给定的术语与正则表达式不匹配:'NAME(ID)');
}
Pair Pair=新对(regex.getParen(1),regex.getParen(2));
返回对;

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

收益率:

你好

一千

引入逗号“,”或撇号“,”对拆分没有任何影响:

String s ="he,llo?1000";
收益率:

他,罗

一千

收益率:

他是

一千

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

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

公共静态对getSplittedByQuestionMark(字符串术语){
String[]list=term.split(“[?]”);
返回新对(列表[0],列表[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()));
    }

}
@测试
public void testGetSplittedByQuestionMark(){
ArrayList terms=新的ArrayList();
应为ArrayList=新的ArrayList();
条款。添加(“测试a”);
条款。添加(“测试?20”);
添加术语(“测试,带逗号?ab10”);
预期。添加(新对(“测试”,“a”));
预期。添加(新的一对(“测试”,“20”));
预期。添加(新对(“测试,带逗号”,“ab10”));

对于(int i=0;我能把文本示例放在一个代码块中,这样我们就可以区分问题和示例了吗?你需要把一个字符串拆分成几个字符吗?所以,字符串“test1?test2,test3”分为“test1”,“test2”,“test3”?你使用的是什么版本的java?我不明白这个问题。。。。。(我怀疑是否有java版本会显示您的问题……)实际上,正则表达式是您的解决方案的问题:\\?不是用于问号,而是用于更多符号的正则表达式。这可能会有所帮助:@michael:问号被转义(请注意\\前面的?)。双反斜杠用于转义,而不是单反斜杠,因为它在Java源代码中是字符串文字。请参阅我的另一个答案,这是解决此问题的一个更简单的解决方案(也为您进行了测试)。在我的另一个解决方案中,针对此类问题给出了一个更通用的答案
@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()));
    }

}