如何在字符串中查找子字符串之前和之后

我有一个字符串说123dance456 ,我需要分成两个字符串,包含子字符串dance之前的第一个子字符串(即123 )和子字符串dance (即456 )。 我需要找到它们并将它们保存在单独的字符串变量中,比如String firstSubString = 123; 和String secondSubString = 456;

是否有任何给定的String方法可以做到这一点?

您可以使用String.split(String regex) 。 做这样的事情:

 String s = "123dance456"; String[] split = s.split("dance"); String firstSubString = split[0]; String secondSubString = split[1]; 

请注意,如果"dance"在原始字符串中出现多次,则split()将在每次出现时分割 – 这就是返回值为数组的原因。

你可以这样做:

 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会更安全:

 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 = ""; } 

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

最容易的是使用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 } 

如果您正在使用commons-lang,请参阅StringUtils.substringAfter()

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

使用扫描仪是一个不错的选择:

 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() );