我的字符串將是這樣的:分割字符串的話在java中
String s = "args: val args1: val1 args2: val3 /*...argsn: valn*/";
///*...argsn: valn*/ means that the string may contain n number of args and vals
其中: ARGS OS話語或單詞的組合,我已經知道 VAL可以是單個單詞或全文可以包含文字和符號,如「:」或「」 ... 我想要做的是對於任何給定‘ARGS’顯示它的‘VAL’
這裏顯示的是我的嘗試:
public class Main {
public static void main(String[] args) {
String s = "arg1: val1 arg2: val2 arg3: va:l3";
String[] rawPairs = s.replace(": ", ":").split(" ");
Map<String, String> argsMap = Arrays.stream(rawPairs).collect(toMap(pair -> pair.substring(0, pair.indexOf(":")), pair -> pair.substring(pair.indexOf(":") + 1)));
System.out.println(argsMap.get("arg3"));
System.out.println(argsMap.get("arg5"));
}
}
這個工程如果「VAL」是一個字,但一旦它是一個文本我得到這個錯誤此輸入:
String s = "arg1: val1 arg2: val2 is a sentence arg3: va:l3";
錯誤:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1967)
at mainTest.lambda$main$0(mainTest.java:306)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at mainTest.main(mainTest.java:306)
您需要另一個分隔符,也許......一定不能發生在arg或val中。 – Lino
你將不得不選擇字符串準確的格式。你給 – XtremeBaumer
還沒有完全選擇2個不同的例子...你看第一個字符串是'一個String = 「ARGS:VAL args1:VAL1 args2:VAL3 /*...argsn:VALN * /」;'然後告訴你'字符串s =「arg1:val1 arg2:val2 arg3:va:l3」;'並且最後一次顯示'String s =「arg1:val1 arg2:val2是一個句子arg3:va:l3」;'。這些是3種完全不同的情況。選擇1,我們可以工作一些東西 – XtremeBaumer