使用subString从String中提取值

时间:2017-06-22 23:51:19

标签: java

在下面someString String我要移除FAIL:并提取最后ID_个号码,并忽略字符串中的所有其他ID_号码。为什么第一个system.out中的方法不起作用,但第二个方法不起作用?

或者达到这个目标的最佳途径是什么?

public static void main(String[] args) {
    String someString = "FAIL: some random message with ID_temptemptemp and with original ID_1234567890";
    System.out.println(someString.split("FAIL: ")[1].substring(someString.lastIndexOf("ID_")));
    String newString = someString.split("FAIL: ")[1];
    System.out.println(newString.substring(newString.lastIndexOf("ID_") + 3));
}

Output:
4567890
1234567890

5 个答案:

答案 0 :(得分:1)

另一种方法是split空格,然后使用replace

 String test = "FAIL: some random message with 
                  ID_temptemptemp and with original ID_1234567890";

String arr[] = test.split (" ");
System.out.println(arr[arr.length -1].replace("ID_", ""));

答案 1 :(得分:1)

Arrays.stream(str.split(" "))
    .filter(x -> x.startsWith("ID_"))
    .map(x -> x.substring(3))
    .reduce((x, y) -> y)
    .ifPresent(System.out::println);

String id = Arrays.stream(str.split(" "))
    .filter(x -> x.startsWith("ID_"))
    .map(x -> x.substring(3))
    .reduce((x, y) -> y)
    .orElse(null);

答案 2 :(得分:1)

在我看来,这类问题通常最好使用正则表达式。使用replace substring indexOf的组合可以起作用,但下一个开发人员很难理解真实的逻辑。

这是正则表达式解决方案:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class testmain {

    public static void main(String[] args) {
        String someString = "FAIL: some random message with ID_temptemptemp and with original ID_1234567890";
        Pattern pattern3 = Pattern.compile("ID_(\\d+)");
        Matcher matcher3 = pattern3.matcher(someString);
        String s = null; 
        while (matcher3.find()) {
            s = matcher3.group(1); // Keep overriding until the last set of captured value
        }
        System.out.println(s);
    }
}

示例输出:

  

1234567890

表达式ID_(\\d+)表示我们正在寻找单词“ID_”的出现,如果匹配,则捕获剩余的数字。

以下while循环只是遍历所有捕获的模式,并使用捕获覆盖s变量,直到最后一个,这符合您的要求。

原始问题:

您的初始解决方案的问题是,在.split(...) [1]位置lastIndexOf(someString.split("FAIL: ")[1])之后的分割值的长度后,字符串不再与原始字符串值相同,因此您应该是做ID_1234567890而不是比较。

因此为您提供输出System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));

示例:

IntelliJ

剩下的代码工作得很好。

<强>提示:

有关调试的提示,可能会获得类似 public void checkComment(Comment comment) { //Check if the comment is valid if (comment != null) { //Do whatever you want to do with your comment for example print to console Console.WriteLine(String.Format("Comment: {0}", comment.Text)); //Check if i have any sub comments if (comment.SubComments.Count > 0) { //Process each sub comment (recursive) comment.SubComments.ForEach(x => checkComment(x)); } } } 的IDE并逐步执行代码以查看代码在每个步骤中执行的操作。这会给你一个更好的主意。

答案 3 :(得分:0)

你的第一次尝试不起作用,因为一旦你完成了这个someString.split("FAIL: ")[1]不可变的字符串&#34; someString&#34;被拆分并创建了两个新的字符串对象。所以substring(someString.lastIndexOf("ID_"))出错是因为你试图使用原始字符串的长度来为较小的字符串进行子字符串操作

我认为解决此问题的最佳方式是someString.substring(someString.lastIndexOf("ID_") + 3) 因为我认为没有使用剥离&#34; FAIL&#34;部分

答案 4 :(得分:0)

它适用于第二个,因为String是不可变的,不能内联替换。

在第一个中你尝试内联,因此它失败了。但是在第二个中你会替换并将其存储在另一个字符串中:

String newString = someString.split("FAIL: ")[1];
System.out.println(newString.substring(newString.lastIndexOf("ID_") + 3));

如果您想使用内联,那么您可以尝试StringBufferStringBuilder