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吗