1、String.split()
String有个方法是分割字符串 .split()。但是有写字符串是需要转义才能分割,不然就会出错。
需要转义的字符串:. $ | ( ) [ { ^ ? * + \\ 共12个特殊字符,遇到以这些字符进行分割字符串的时候,需要在这些特殊字符前加双反斜杠 \\
例如:
str.split("\\.")
str.split("\\$")
str.split("\\|")
str.split("\\(")
str.split("\\)")
str.split("\\[")
str.split("\\{")
str.split("\\^")
str.split("\\?")
str.split("\\*")
str.split("\\+")
str.split("\\\\")
2、源码:
- public String[] split(String regex) {
- return split(regex, 0);
- }
- public String[] split(String regex, int limit) {
- /* fastpath if the regex is a
- (1)one-char String and this character is not one of the
- RegEx's meta characters ".$|()[{^?*+\\", or
- (2)two-char String and the first char is the backslash and
- the second is not the ascii digit or ascii letter.
- */
- char ch = 0;
- if (((regex.value.length == 1 &&
- ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
- (regex.length() == 2 &&
- regex.charAt(0) == '\\' &&
- (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
- ((ch-'a')|('z'-ch)) < 0 &&
- ((ch-'A')|('Z'-ch)) < 0)) &&
- (ch < Character.MIN_HIGH_SURROGATE ||
- ch > Character.MAX_LOW_SURROGATE))
- {
- int off = 0;
- int next = 0;
- boolean limited = limit > 0;
- ArrayList<String> list = new ArrayList<>();
- while ((next = indexOf(ch, off)) != -1) {
- if (!limited || list.size() < limit - 1) {
- list.add(substring(off, next));
- off = next + 1;
- } else { // last one
- //assert (list.size() == limit - 1);
- list.add(substring(off, value.length));
- off = value.length;
- break;
- }
- }
- // If no match was found, return this
- if (off == 0)
- return new String[]{this};
-
- // Add remaining segment
- if (!limited || list.size() < limit)
- list.add(substring(off, value.length));
-
- // Construct result
- int resultSize = list.size();
- if (limit == 0)
- while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
- resultSize--;
- String[] result = new String[resultSize];
- return list.subList(0, resultSize).toArray(result);
- }
- return Pattern.compile(regex).split(this, limit);
- }