编程比赛中的一道题目
标题:正则表示
正则表达式表示了串的某种规则或规律。恰当地使用正则表达式,可以使得代码简洁、事半功倍。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},只有当出现",,,,"分割字符串。
- 使用多个不同字符分割字符串,可以使用|符号连接不同字符。如第二种解决方案,查看结果也会发现,不能同时分割字符串的情况,只能依次按表达式,单独分次分割字符串,于是出现了两行空格。
- 另外单独使用|分割字符串时记得使用\\|。
- 在完成上面题目时前面被“把一个或多个空格或逗号、句号分开的单词分离出来”误导,于是出现了第二种解决方案,其实我们并没有注意到如第一个表格中的特殊含义字符,使用这些特殊字符搭配第二个表格的出现次数符号,很容解决了上面的问题。
- 不知道你是否理解了呢?如果还不理解,可以试着先使用单独字符试验一遍,在搭配不同字符,由简入繁,获得最终理想的结果。