Java 使用子字符串从字符串中提取值

Java 使用子字符串从字符串中提取值,java,Java,在下面的someStringString中,我想删除失败:并提取最后一个ID编号,忽略字符串中的所有其他ID编号。为什么第一个system.out中的方法不起作用,而第二个却起作用 或者,实现这一目标的最佳方式是什么 public static void main(String[] args) { String someString = "FAIL: some random message with ID_temptemptemp and with original ID_1234567

在下面的
someString
String
中,我想删除
失败:
并提取最后一个
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

另一种方法是
在空格上拆分
,然后使用
替换

 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_", ""));

另一种方法是在空格上
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_", ""));

第一次尝试不起作用,因为完成此操作后,
someString.split(“FAIL:”)[1]
将拆分不可变字符串“someString”,并创建两个新字符串对象。因此
子字符串(someString.lastIndexOf(“ID”))
出错,因为您试图将原始字符串的长度用于较小字符串的子字符串操作

在我看来,解决这个问题的最佳方法是
someString.substring(someString.lastIndexOf(“ID”)3)

因为我看不出剥离“FAIL”部分有什么用,所以您的第一次尝试无效,因为一旦您完成此操作,someString.split(“FAIL:”)[1]将拆分不可变字符串“someString”,并创建两个新的字符串对象。因此
子字符串(someString.lastIndexOf(“ID”))
出错,因为您试图将原始字符串的长度用于较小字符串的子字符串操作

在我看来,解决这个问题的最佳方法是
someString.substring(someString.lastIndexOf(“ID”)3)

因为我认为去掉“FAIL”部分没有用,所以它在第二个部分中有效,因为字符串是不可变的,不能内联替换

在第一种方法中,您尝试以内联方式执行,因此失败了。但在第二个字符串中,您将替换它并将其存储在另一个字符串中:

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

如果要使用内联,则可以尝试
StringBuffer
StringBuilder

因为字符串是不可变的,不能内联替换,所以它在第二个版本中工作

Arrays.stream(str.split(" "))
    .filter(x -> x.startsWith("ID_"))
    .map(x -> x.substring(3))
    .reduce((x, y) -> y)
    .ifPresent(System.out::println);
在第一种方法中,您尝试以内联方式执行,因此失败了。但在第二个字符串中,您将替换它并将其存储在另一个字符串中:

String newString = someString.split("FAIL: ")[1];
System.out.println(newString.substring(newString.lastIndexOf("ID_") + 3));
如果要使用内联,可以尝试
StringBuffer
StringBuilder

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


在我看来,这类问题通常最好使用正则表达式。虽然组合使用
replace
子字符串
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_u(\\d+)
表示我们正在查找单词“ID_uu”的出现情况,如果匹配,则捕获剩余的数字

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

原始问题:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));
初始解决方案的问题是,在执行
.split(…)
后,位置
[1]
字符串中拆分的值的长度不再与原始字符串值相同,因此您应该执行
lastIndexOf(someString.split(“FAIL:”)[1])
来进行比较

因此,为您提供输出
ID\u 1234567890

示例:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));
剩下的代码工作正常

提示:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));

调试提示,可能需要一个像
IntelliJ
这样的IDE,然后逐步浏览代码,查看代码在每一步中的作用。这会给你一个更好的主意。

在我看来,这类问题通常最好使用正则表达式。虽然组合使用
replace
子字符串
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_u(\\d+)
表示我们正在查找单词“ID_uu”的出现情况,如果匹配,则捕获剩余的数字

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

原始问题:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));
初始解决方案的问题是,在执行
.split(…)
后,位置
[1]
字符串中拆分的值的长度不再与原始字符串值相同,因此您应该执行
lastIndexOf(someString.split(“FAIL:”)[1])
来进行比较

因此,为您提供输出
ID\u 1234567890

示例:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));
剩下的代码工作正常

提示:

System.out.println(someString.split("FAIL: ")[1].substring(someString.split("FAIL: ")[1].lastIndexOf("ID_")));

调试提示,可能需要一个像
IntelliJ
这样的IDE,然后逐步浏览代码,查看代码在每一步中的作用。这会给你一个更好的主意。

不。我的
字符串
就是我的OPNope中的字符串。我的
String
在我的操作中是这样的谢谢使用
StringUtils
有没有一种直接的方法可以做到这一点?你可以使用Apache commons StringUtils类的'substringAfterLast()'方法谢谢使用
StringUtils
有没有一种直接的方法可以做到这一点?你可以使用'substringAfterLast()'Apache commons StringUtils类的方法谢谢。我在
stream
中期待一些东西,而这一个可以工作。您知道如何使用
stream
将最后一个字符串分配给另一个字符串吗只想用其他东西替换
System.out
。我在
流中期待一些东西
,而这一个可以工作。你知道如何分配这个fin吗