概述

当我们处理一个字符串问题的时候可以尝试一下使用正则,这样代码的可读性将会大大的提高,不过这么做的话,之前的一个问题就变成了两个问题(😄)。

详解

字符串匹配

简单字符串匹配

模式是正则表达式最基本的元素,他是一组描述字符串特征的字符。 最简单的模式就是一个字符串,不包含任何特殊的字符串,比如:hello,这中模式可以匹配任意包含了hello的字符串,如:aaa hello world !^表示以什么开头的字符串,比如^hello表示以hello开头的字符串,这种模式可以匹配任何hello开头的字符串,如:hello word$表示以什么结尾的字符串,比如hello$表示以hello结尾的字符串,这种模式可以匹配任何hello结尾的字符串,如:world hello

转义字符匹配

在上面的模式匹配中,字符都是代表其本身(这里想表达的是有些字符并不是代表其自身,也即是转义字符,如^\t并不是标记以\t开头的字符串,而是 以制表符tab开头的字符串),\r代表回车、\n代表新行、\s代表空格。

字符簇匹配

字符簇匹配的意思是匹配一个指定的字符范围,不过这里仅仅是匹配单个字符,具体规则如下

1
2
3
4
5
6
[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符

可以举个例子:^[0-9][a-z]$表示匹配一个长度为2的字符串,并且字符串的首字符是一个数字,尾字符是一个小写的字母。 值得一提的是,如果在方括号中使用^表示取反的意思。如^[^a-z][0-9]$表示长度为2的字符串,不过首字符只要不是小写字母就可以

重复字符

对于重复出现的字符,上面的规则显然就不适用了,通常情况下使用{}来表示匹配多个字符,例如我们可以用^[a-z]{1,}来匹配所有的长度大于1的 并且是小写字符的字符串。我们也可以指定{}中数字的范围来指定前面的模式出现的次数。这里我们也可以简化一下,用来表示可选({0,}),用 +表示至少一个({1,})。

逻辑运算

可以用|代表或的逻辑,其他的待整理。

示例

最后还是来一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
给定一个单词,你需要判断单词的大写使用是否正确。

我们定义,在以下情况时,单词的大写用法是正确的:

全部字母都是大写,比如"USA"。
单词中所有字母都不是大写,比如"leetcode"。
如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。
否则,我们定义这个单词没有正确使用大写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/detect-capital
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1
2
3
4
5
6
7
8
import java.util.regex.Pattern;
class Solution {
public boolean detectCapitalUse(String word) {
String reg = "^([A-Z][a-z]+|[a-z]+|[A-Z]+)$";
Pattern p = Pattern.compile(reg);
return p.matcher(word).find();
}
}

小结

关于正则的分析就到现在为止吧,有时间再继续整理。