📅  最后修改于: 2023-12-03 15:09:54.433000             🧑  作者: Mango
在开发中,经常需要查找字符串中某个子串的位置或范围,比如在编辑器中查找关键字的位置、在文本处理工具中查找特定字符串的出现次数等。本文将介绍如何快速查找字符串范围的一些方法。
indexOf()
方法可以查找字符串中某个子串第一次出现的位置,返回该位置的索引值,如果找不到,则返回-1。例如:
String str = "hello world";
int index = str.indexOf("world"); // 返回6
lastIndexOf()
方法可以查找字符串中某个子串最后一次出现的位置,返回该位置的索引值,如果找不到,则返回-1。例如:
String str = "hello world";
int index = str.lastIndexOf("o"); // 返回7
这两个方法虽然简单,但是并不能返回字符串的范围,需要自己计算。例如,如果要查找字符串中某个子串的所有位置,需要用循环结合indexOf()方法来实现。以下是一个示例代码:
String str = "hello world";
String target = "o";
int index = str.indexOf(target);
while (index >= 0) {
System.out.println(index + "-" + (index + target.length() - 1));
index = str.indexOf(target, index + target.length());
}
以上代码可以输出字符串中所有子串"o"的位置范围。
正则表达式是一个可用于匹配字符串的强大工具,其支持匹配模式、范围等特性。可以使用Pattern
和Matcher
类进行匹配,也可以使用字符串的matches()
方法进行匹配。例如:
String str = "hello world";
String regex = "(?<=hello )\\w+"; // 匹配hello后面的单词
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.start() + "-" + (matcher.end() - 1));
}
以上代码可以输出字符串中所有匹配正则表达式"(?<=hello )\w+"的位置范围。
Apache Commons Lang是一个常用的Java库,其提供了一系列字符串处理工具类。其中StringUtils
类中提供了很多有用的方法,如indexOfAny()
、lastIndexOfAny()
、indexOfAnyBut()
、lastIndexOfAnyBut()
等等,这些方法都可以返回字符串中某个子串的范围。例如:
String str = "hello world";
String[] targets = {"o", "r", "l"}; // 查找多个子串
int[] ranges = StringUtils.indexOfAny(str, targets);
for (int i = 0; i < ranges.length; i += 2) {
System.out.println(ranges[i] + "-" + ranges[i + 1]);
}
以上代码可以输出字符串中所有子串"o"、"r"、"l"的位置范围。
StringTokenizer
类可以将一个字符串按照指定的分隔符拆分成多个子串,其提供了一些方法用于查找和获取子串。例如:
String str = "hello world";
String delim = " ";
StringTokenizer st = new StringTokenizer(str, delim);
while (st.hasMoreTokens()) {
String token = st.nextToken();
int start = str.indexOf(token);
int end = start + token.length() - 1;
System.out.println(start + "-" + end);
}
以上代码可以输出字符串中所有单词的位置范围。
综上所述,以上方法都可以用于快速查找字符串范围,程序员可以根据实际需求选择适合自己的方法进行使用。