如何在字符串中查找子串前后的内容

26
我有一个字符串,比如123dance456,我需要将它分成两个子字符串,第一个子字符串包含子字符串 dance 之前的部分(即123),第二个子字符串包含子字符串 dance 之后的部分(即456)。我需要找到它们并将它们存储在不同的字符串变量中,例如String firstSubString = 123;String secondSubString = 456;
是否有任何现成的String方法可以做到这一点?

可以完成,但确切的格式是什么?我的意思是舞蹈会一直在那里吗? - dku.rajkumar
@dku.rajkumar:是的,“dance”子字符串总是存在的。split()应该可以解决问题。我本应该已经想到这样一个方法了。我原以为我可能需要编写一个正则表达式来解决它。谢谢 :) - skip
如果不需要正则表达式,只需按照答案中提到的使用String[] str = string.split("dance");即可。 - dku.rajkumar
6个回答

52

你可以使用String.split(String regex)。只需要像这样做:

String s = "123dance456";
String[] split = s.split("dance");
String firstSubString = split[0];
String secondSubString = split[1];
请注意,如果原始字符串中出现多个"dance"split()方法将在每个出现位置进行分割,这就是为什么返回值是一个数组的原因。

22
你可以这样做:
String str = "123dance456";
String substr = "dance";
String before = str.substring(0, str.indexOf(substr));
String after = str.substring(str.indexOf(substr) + substr.length());

或者

String str = "123dance456";
String substr = "dance";
String[] parts = str.split(substr);
String before = parts[0];
String after = parts[1];
值得注意的是,如果我们有多个子字符串出现,第二个答案将不起作用。为此,如果我们只想识别第一个子字符串,更安全的做法是使用带有限制的 split 函数:

需要注意的是,如果存在多个子字符串,则第二个答案不起作用。因此,如果我们仅想识别第一个子字符串,最好使用带有限制的split函数:

String[] parts = str.split(substr, 2);

这将确保返回的数组最多只有两个元素。而且,由于split会将其输入解释为正则表达式,我们必须小心无效的正则表达式语法。因此,我更喜欢第一种解决方案,因为它不管原始子字符串的组成如何都可以正常工作。

要使第一个答案更有效率 - 因为这是我更喜欢的答案 - 我们需要记住子字符串的位置:

final int position = str.indexOf(substr);
if (position >= 0) {
    //if the substring does occur within the string, set the values accordingly
    before = str.substring(0, position);
    after = str.substring(position + substr.length());
} else {
    //otherwise, default to the empty string (or some other value)
    before = "";
    after = "";
}

关注这些小边缘情况总是值得的。


parts 将是一个 String[] - Paul Bellora
分割不会返回一个数组吗? - Murat Derya Özen

5
如果您正在使用commons-lang,请查看StringUtils.substringAfter()函数。

4

最简单的方法是使用split方法,正如其他答案所建议的那样。你也可以使用MatcherPattern进行更一般化的处理:

String str = "123dance456";
String splitter = "dance";
Pattern p = Pattern.compile("(.*?)" + splitter + "(.*)");
Matcher m = p.matcher(str);
if (m.matches()) {
    firstSubString = m.group(1); // may be empty
    secondSubString = m.group(2); // may be empty
} else {
    // splitter not found in str
}

1
String[] data = new String("123dance456").split("dance");

0

使用Scanner是一个不错的选择:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );   

将标记处理为流并通过hasNext()查询是否有新的标记可用非常方便。此外,您可以获得来自Scanner的良好转换,甚至是本地化的,例如:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
System.out.println( scanner.nextDouble() * scanner.nextDouble() );   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接