- split(String regex)与split(String regex, int limit)中对Limit的处理:
-
stringInstance.split(String regex),分割会进行完全,分割形成的字符串数组长度无限制,对于末尾分隔符全部忽略,相当于stringInstance.split(String regex, 0);
-
stringInstance.split(String regex, int limit),limit的处理分为3种:
a. n > 0时,分割会进行 (n - 1) 次,分割形成的字符串数组长度不大于n
b. n < 0时,分割会进行完全,分割形成的字符串数组长度无限制
b. n == 0时,分割会进行完全,分割形成的字符串数组长度无限制,对于末尾分隔符全部忽略
以字符串 "boo:and:foo"为例:
Regex | Limit | Result |
---|---|---|
: | 2 | { “boo”, “and:foo” }} |
: | 5 | { “boo”, “and”, “foo” }} |
: | -2 | { “boo”, “and”, “foo” }} |
o | 5 | { “b”, “”, “:and:f”, “”, “” }} |
o | -2 | { “b”, “”, “:and:f”, “”, “” }} |
o | 5 | { “b”, “”, “:and:f” }} |
- 对正则表达式的处理大致分为以下四种:
-
普通字符匹配
-
双引号匹配需要1个转义字符
-
正则表达式字符匹配需要2个转义字符
总结一下java正则表达式需要转义的字符: ( [ { } ] ) . + - * ^ ? / | \ $
即:三种括号,加减乘除幂,小数点,dollar,?/,| \
-
转义字符匹配需要3个转义字符
public class TestRegexMatching {
public static void main(String[] args) {
System.out.println(":a\"b::c-d\\ef|g::\n");
String[] s0 = ":a\"b::c-d\\ef|g::".split(":", -1); // 1-1. 普通字符匹配 (不忽略任何一个分隔符)
for (int i = 0; i < s0.length; i++)
System.out.println(i + ": " + s0[i]);
System.out.println();
String[] s1 = ":a\"b::c-d\\ef|g::".split(":", 4); // 1-2. 普通字符匹配(分割形成的字符串数组长度为4)
for (int i = 0; i < s1.length; i++)
System.out.println(i + ": " + s1[i]);
System.out.println();
String[] s2 = ":a\"b::c-d\\ef|g::".split(":|\""); // 2. 双引号匹配需要一个转义字符\ (末尾分隔符全部忽略)
for (int i = 0; i < s2.length; i++)
System.out.println(i + ": " + s2[i]);
System.out.println();
String[] s3 = ":a\"b::c-d\\ef|g::".split(":|\\-"); // 3. 正则表达式字符匹配需要两个转义字符\\
for (int i = 0; i < s3.length; i++)
System.out.println(i + ": " + s3[i]);
System.out.println();
String[] s5 = ":a\"b::c-d\\ef|g::".split("\\|");
for (int i = 0; i < s5.length; i++)
System.out.println(i + ": " + s5[i]);
System.out.println();
String[] s4 = ":a\"b:c-d\\ef|g::".split("\\\\", -1); // 4. 转义字符匹配需要三个转义字符\\\
for (int i = 0; i < s4.length; i++)
System.out.println(i + ": " + s4[i]);
}
}