正则表达式: 主要用于操作字符串的规则
用于检索替换那些符合规定的文本
预定义字符
. 任何字符
. 就单纯代表.
\d是 数字
\D 非数字
\s 空白字符 包括\t \n \r
\S 非空白字符
\w 单词字符 比如 a—z A-Z _还有0到9
\W 非单词字符
如果预定义字符没有加上数量词 那就只能匹配一个字符
数量词:
? 一次或者一次也没有
* 0次或者多次
+ 1次或者多次
{n}恰好n次
{n,} 至少n次
{n,m} 至少n次,但是不超过m次
范围词:
没有数量词就只能匹配一个字符
[abc] 在abc内
[^abc] 除了abc外
[a-zA-Z] a到z或者A到Z 两头字母包括在内
[a-d[m-p]]a到d或者m到p 并集
[a-d&&[def]] 交集
匹配功能
举个例子:
String match="1[12a]\\d{2}";
System.out.println(number.matches(match)?"ok":"flase");//number是被匹配的字符串
意思就是第一个为1 第二个为1或2或a 接下来的为数字并且有且只有两个
再举例:
String match="a\\d{0,2}[a]{2}";
第一个为a 第二个开始后0个到2个内必须为数字 剩下的两位必须为a
数量词如{2} 必须跟范围词或者预定义符后面有效 是对这两个的修饰
切割功能
举例:根据空格来对字符串进行切分
String str = "aa.bb.cc";
str = "-1 99 4 23";
String[] arr = str.split(" +"); //+这里代表一个或者多个空格
再举例:根据重叠词进行切割
String str = "sdqqfgkkkhjppppkl";
String[] arr = str.split("(.)\\1+");
注意:为了提高规则复用,用()进行封装,每一个括号都有一个编号,从1开始,为了复用这个规则。可以通过编号来完成该规则的调用。需要对编号数字进行转义。\1就代表获取1组规则。
等于说 第一次获得s 然后\1引用 变成ss+ 无法切割 然后下一个
替换:
String name="wocao141311164sdfsdf1232";
String reg="1[2345]\\d{3}";
String aa=name.replaceAll(reg, "****"); //将满足条件的内容替换成****格式
替换重复的
String name="wo我洗爱你你你";
String reg="(.)\\1+";
String aa=name.replaceAll(reg,"$1");
如果需要在replaceAll方法正则的时候外部引用组的内容 要使用$组号
查找:
范例:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
**注意:步骤:
1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);
2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象(Matcher)。
3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作**
查找三个的单词
String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";
String reg="\\b[a-zA-Z]{3}\\b";
Pattern pattern=Pattern.compile(reg);
Matcher matcher= pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group());
}
先find(寻找有没有满足的 然后下移位置)才可以group(得到满足条件的字符串)
\b是边界词 不匹配 只表示开始和结束
匹配emil:
String str = "[email protected]"; true
str="[email protected]"; false
String reg="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
System.out.println(str.matches(reg));
网络爬虫:emil
String content="有事没事联系:[email protected] 又是没事士大夫似的说的说的[email protected]@22.cn.com";
String reg="[a-zA-Z1-9]\\w{5,7}@[a-zA-Z0-9]{2,}(\\.(com|cn|net)){1,2}";
Matcher matcher= pattern.matcher(content);
while(matcher.find()) {
System.out.println(matcher.group());
}
我认为的重点:
\b 熟悉: 匹配的是位置
\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w
String str = "sshello world";
String reg="hello\\b";
Pattern pattern=Pattern.compile(reg);
Matcher matcher= pattern.matcher(str);
while(matcher.find()) {
String name=matcher.group();
System.out.println(name);
}
抽象出来直接看区别:
**String str = “sshello world”;
String reg=”hello\b”;**
返回hello
分析:
以hello结尾
**String str = “ss hello,world”;
String reg=”\bhello”;**
返回hello
分析:
以hello开头
就用 “It’s a nice day today.” 举例说明:
正确的正则:\bnice\b
分析:第一个 \b 前面一个字符是空格,后面一个字符是 ‘n’,不全是 \w,
所以可以匹配出 ‘n’ 是一个单词的开头。第二个 \b 前面一个字符是 ‘e’,
后面一个字符是空格,不全是 \w,可以匹配出 ‘e’ 是一个单词的结尾。
所以,合在一起,就能匹配出以 ‘n’ 开头以 ‘e’ 结尾的单词,
这里就能匹配出 “nice” 这个单词。
举例:
String str = “ss shello world”;
String reg=”hello\b w”;
返回hello w
分析:
以hello结尾 空格w开始 的内容
String str = “ss shello world”;
String reg=”hello\bw”;
失败
分析:
hello后面跟着w 违反了\b前后不能同时为\w所以匹配不到 reg就写错了
String str = “ss shello,world”;
String reg=”hello\b.w”;
返回 hello,w
虽然.是任何字符都行 但是还是要根据str来判断 如文中 ,不是\w所以可以匹配到
如果是String str = “ss shellosworld”; 则无法匹配到