简介
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
主要对字符串进行合法验证
正则表达式是一种通用的技术。适用于绝大多数流行的编程语言
好处
[a-zA-Z]\w{5,17}是一个正则表达式
用精简的语法代替了复杂的验证逻辑
极大的提高了开发效率
单字符匹配
[bat] 代表这个字符必须要是中括号里面其中一个即可
[^abc] 代表除了abc以为的任意字符就可以。^ 是异或符号
[a-zA-z]代表是大小写字母的所有字母
[a-d[m-p]] 等于[a-dm-p] 同时包含a-d m-p的所有字母
[a-z&&[def]] 代表a-z里面包含def的值
[a-z&&[^bc]] a-z里面非bc的所有字母
[a-z&&[^m-p]] a-z里面除了m-p的所有字母
预定义字符
注意在java中 \ 会转义,所以需要进行编译需要多加一个\ 例如\d需要 \d
\d 代表0-9的阿拉伯数字
\D 非数字
注意的是在程序中,单词注意是大小写字母与阿拉伯数字下划线。为单词
量词
String regex = “6{4}”
x{m} 代表一个x出现了m次。例如上面的代表4需要出现4次则匹配
x{n, m} 代表n到m次。6{1,3}代表6出现1-3次
x{n, } 代表6最少出现n次
以此类推
例如:
x{n} 需要x出现n次
贪婪,勉强,独占的区别
- 贪婪
- 先吞掉整个字符串进行匹配,如果匹配失败,则吐出最后一个字符串。然后再次匹配。重复过程。最后匹配成功
- 勉强
- 先吞掉字符串的第一个字符串,如果失败,则再次吞掉下一个字符串。以此重复。一直到成功
- 独占
- 吞掉整个字符串进行唯一匹配
Matches,Patterm
主要是Matches有多个方法使用。例如find,start,group,end等
Matches
String input = "111_234_455_555";
// 查询字符串是否有连续的3个数字
String regex = "\\d{3}";
// 检查正则是否正确
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
if(m.find()){
// 获取匹配成功的字符串
m.group();
// 获取匹配成功的字符串的范围。开始于结束
m.start();
m.end();
}
捕获组
在正则中,小括号() 表示捕获组
这个组,也就是在匹配的时候知,将某一部分的字符(道串)作为组处理,这个组,可以在正则表达式的其它位置或者匹配回的结果中使用,如:
^\s+([a-zA-Z]+?)\s.+$
匹配 " abcd 这是什么答"
如果没有小括号,那么匹配只有一个结果,也就是整个字符串" abcd 这是什么"
而添加了小括号,匹配就会有两个结果了:
1 " abcd 这是什么"
2 “abcd”
非捕获组-反向引用
非捕获组只匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。
首先(?:pattern)与(pattern)不同之处只是在于不捕获结果。
接下来的四个非捕获组用于匹配pattern(或者不匹配pattern)位置之前(或之后)的内容。匹配的结果不包括pattern。
参与匹配却不进行分组编号的捕获组,其形式为(?:exp)组c成
边界匹配符
那些是单词边界
除了大小写英文,阿拉伯数字,下划线,其他国家正常文字。