正则表达式与java String.split()

编程比赛中的一道题目

标题:正则表示

正则表达式表示了串的某种规则或规律。恰当地使用正则表达式,可以使得代码简洁、事半功倍。java的很多API都支持正则表达式作为参数。其中的String.split就是这样。

看下面的代码,其意图为把一个或多个空格或逗号、句号分开的单词分离出来。即获得数组为:

["cat","doc","desk","push","last","this","is","what","must","be"]

请在划线处填入适当代码,取得要求的效果。

String s = "cat dog,desk push last, this is what. must be";

String[] ss = s.split("______________________________"); //填空位置

for(String k: ss) System.out.println(k);


注意:只提交划线部分缺少的内容,不要写其它附加内容,比如:说明性的文字或已经存在的代码。

 

为了解决上面的题目,查阅了最终的解决方案。

String[] ss1 = s.split("\\W+");
for(String k: ss1) System.out.println("s1:"+k);

通过该操作可以获得正确结果:

s1:cat
s1:dog
s1:desk
s1:push
s1:last
s1:this
s1:is
s1:what
s1:must
s1:be

另外在获得正确答案之前,有以下思路:
String[] ss = s.split("\\,|\\s+|\\.");
for(String k: ss) System.out.println(k);

获得结果如下:

cat
dog
desk
push
last

this
is
what

must
be

注意其中多出了两行空行,这其实是由于|操作中只能起到单个选项的作用。不能起到并集作用。

 可供参考:

在正则表达式中具有特殊含义的字符

特殊字符

描述

    .     表示任意一个字符
    [abc]     表示a、b或c中的任意一个字符
    [^abc]     除a、b和c以外的任意一个字符
    [a-zA-z]     介于a到z,或A到Z中的任意一个字符
    \s     空白符(空格、tab、换行、换页、回车)
    \S     非空白符
    \d     任意一个数字[0-9]
    \D     任意一个非数字[^0-9]
    \w     词字符[a-zA-Z_0-9]
    \W     非词字符

表示字符出现次数的符号

 

表示次数的符号

描述

    *     0 次或者多次
    +     1 次或者多次
    ?     0 次或者 1 次
    {n}     恰好 n 次
    {n, m}     至少 n 次,不多于 m 次

public String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。  其中regex必须为正则表达式。
  如上面表格,与普通字符串不同,很多字符代表特殊意义,因此如",""."之前都要加上双右斜线\\,第二个表格中可以规定一个分割符重复的次数,如\\,{4},只有当出现",,,,"分割字符串。
  使用多个不同字符分割字符串,可以使用|符号连接不同字符。如第二种解决方案,查看结果也会发现,不能同时分割字符串的情况,只能依次按表达式,单独分次分割字符串,于是出现了两行空格。
另外单独使用|分割字符串时记得使用\\|。
  在完成上面题目时前面被“把一个或多个空格或逗号、句号分开的单词分离出来”误导,于是出现了第二种解决方案,其实我们并没有注意到如第一个表格中的特殊含义字符,使用这些特殊字符搭配第二个表格的出现次数符号,很容解决了上面的问题。
  
  不知道你是否理解了呢?如果还不理解,可以试着先使用单独字符试验一遍,在搭配不同字符,由简入繁,获得最终理想的结果。

正则表达式与java String.split(),布布扣,bubuko.com

正则表达式与java String.split()

上一篇:Threejs TrackballControl源码解析


下一篇:java操作excel进行导入导出