1. split
split可以把串分解为片语(token)。此动作,俗称“打散”。
需要注意的是,其中的参数并不是“分隔串”,而是一个“正则表达式”。
String s = "xyz,abc,123";
String[] ss = s.split(",");
这种用法是正确的。因为,逗号并不是正则表达式的关键字。如果想把“12+25”分解为“12”和“25”,就不能像下面这样写了:
String s = "12+25";
String[] ss = s.split("+");
这是因为“加号”在正则表达式中有特殊的含义。如果希望作为分隔符的就是“+”,则可以采用转义的办法来表达。
String[] ss = s.split("[+]");
或者
String[] ss = s.split("\\+");
其中,有些奇怪的是第二种写法。之所以写两个反斜线,是因为,反斜线也是java串中的转义符号,所以此处是经过了两次转义。第一次是java转义,第二次是正则表达式的转义。
2. java.util.StringTokenizer
有的时候,使用StringTokenizer更容易对串进行分解工作。这是类可根据我们提供的分隔符号把一个串,分解为多个token,分解的时候,也可以包含分隔符本身,也可以不包含。
String s = "23+45-(3+5*2)";
StringTokenizer st = new StringTokenizer(s,"+-*/()",true);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
另外,countTokens()可以返回tokens的数目。
3. 正则表达式
正则表达式代表字符序列的一定的“样式”。我们可以去判断,给定的样式是否与某个串相匹配。也可以从一个序列中去提取出匹配的子串来。
String s1 = " AD12 ";
String s2 = "\\s*[A-Za-z]{1,3}[0-9]{1,4}\\s*";
System.out.println(Pattern.matches(s2,s1));
[0-9A-Fa-f] 含义就是:0|1|2|3...|A|B|C|D|E|F|a|...
matches()方法判断给定的样式s2是否与s1相匹配。它的返回值是boolean类型。上面这段代码判断s1是否符合excel表的单元格“相对表示法”。
\s 表示空白字符。
方括号内表示字符本身。有一些限定数量的量词,它们可能是:
* 表示0个或多个
+ 表示1个或多个
? 表示0个或1个
{m,n} 表示至少m个,至多n个
{m} 表示正好m个
下面是判断手机号码的一个例子:
String s1 = "1350555117";
String s2 = "(138|136|135)[0-9]{8}";
System.out.println(Pattern.matches(s2,s1));
下面是判断身份证号码的例子:
String s1 = "320111197103254419";
String s2 = "[0-9]{6}19[0-9][0-9][0-1][0-9][0-2][0-9][0-9]{4}";
System.out.println(Pattern.matches(s2,s1));
Pattern除了能够判断是否匹配,还能够把已经匹配上的子串从母串中分离出来。
String s1 = "56+14-5*(2+6)-56+48";
String s2 = "\\+|\\-|\\*|\\/|\\(|\\)";
Pattern p = Pattern.compile(s2);
Matcher m = p.matcher(s1);
while(m.find()){
System.out.println(m.group() + "," + m.start() + "," + m.end());
}
上例中,寻找 +-*/ 及括号的位置,输出匹配项,并其起始和结束位置。
Matcher类代表一个遍历串的匹配工具。它用 find() 搜索下一个匹配项,group() 输出匹配项的内容,start(), end() 给出匹配项出现的开始和结束位置。
String s1 = "2+5*3/5-4";
String s2 = "[0-9]{1,2}\\*[0-9]{1,2}|[0-9]{1,2}\\/[0-9]{1,2}";
Pattern p = Pattern.compile(s2);
Matcher m = p.matcher(s1);
if(m.find()){
String t = m.group();
s1 = m.replaceFirst("kkk");
}
System.out.println(s1);
上面的代码,在s1中搜索第一个出现的乘法或除法算式,并把它用“kkk”去代替。此处,replaceFirst()方法,把第一处匹配用另一个串去代替。这个方法很有用。我们可以利用这个动作去对四则运算求值。