我有一个字符串123dance456
,我需要将其拆分为两个字符串,其中包含子字符串dance
之前的第一个子字符串(即123
)和之后的子字符串字符串dance
(即456
)。我需要找到它们并将它们保存在单独的字符串变量中,例如String firstSubString = 123;
和字符串secondSubString = 456;
。
是否有任何给定的String方法可以做到这一点?
答案 0 :(得分:45)
您可以使用String.split(String regex)
。做这样的事情:
String s = "123dance456";
String[] split = s.split("dance");
String firstSubString = split[0];
String secondSubString = split[1];
请注意,如果"dance"
在原始字符串中出现多次,split()
将在每次出现时拆分 - 这就是返回值为数组的原因。
答案 1 :(得分:18)
你可以这样做:
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 = "";
}
注意这些小边缘情况总是值得的。
答案 2 :(得分:5)
如果您正在使用commons-lang,请参阅StringUtils.substringAfter()
答案 3 :(得分:4)
最简单的方法是使用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
}
答案 4 :(得分:1)
String[] data = new String("123dance456").split("dance");
答案 5 :(得分:0)
使用扫描仪是一个不错的选择:
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() );