如何在字符串中查找子字符串之前和之后
我有一个字符串说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
方法,如其他答案所示。 您还可以使用Matcher
和Pattern
来实现更通用的方法:
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() );