正则表达式基础总结

今天学正则表达式,发现正则表达式知识点很碎,于是做了一下总结,在此分享一下。

正则表达式:

用来匹配某些字符,比如数字字母,汉字,下划线,及如 等特殊字符,比较好用的软件有RegexBuddy软件,推荐初学者可以用这个软件熟悉一下正则的语法

一些匹配的原则

1      \    {     }    *等用来匹配特殊字符比如 可以匹配所有的制表符

2:对于常见的数字字母,汉字,下划线等普通字符在匹配一个字符串时,匹配与之对应的一个字符

  1. 一些可以匹配多个字符的表达式

   代表换行符

   代表制表符

  \代表本身

^ ,$,&等等代表匹配这些字符本身

d代表匹配0-9数字的任意一个(比如十位数会看成两个个位数匹配两)

w任意一个字母数字或者下划线,也就是A~Za~z0~9,_中任意一个

W。相对于w取反

s包括空格,制表符,换行符等空白字符的任意一个

s。相对与S取反

.小数点可以匹配任意一个字符如果要匹配任意包括“N”在内的所有字符,一般用【sS(.不可以匹配换行符但sS可以匹配任何字符)

4:自定义匹配原则

[abc&]表示可以匹配abc&

[^abc]表示可以匹配除了abc之外所有的字符

[f-k]表示可以匹配f-k之间的所有字符

[^a-f0-3]表示可以匹配af0-3之外的所有字符

-------正则表达式的特殊字符,被包含到中括号中,则失去特殊含义,除了^,-之外

------标准字符集合,除小数点之外如果被包含在中括号,自定义字符集合将包含再此集合,比如

[d.-+]将匹配数字,小数点,+-(其实就是一种或的关系)(对于小数点将失去匹配所有字符的含义,只是小数点而已)

5量词

含义:修饰匹配次数的特殊符号

{n}:表示重复n次,比如d{9}表示匹配连续的9个数字

{n,m}:表示至少重复n次,之多重复m次比如ad{0,1}b表示ab之间有一个或者零个数字

{m,}:表示至少重负m

:匹配表达式0次或者1次,相当于{0,1}

+:表达式至少出现1次,相当于{1}

*:表达式不出现或出现任意次,相当于{0}

匹配次数的贪婪模式(匹配字符越多越好,默认!)比如对于{3,6}最多匹配6次最少3次则根据贪婪模式会把前六个匹配23678951

对于非贪婪模式就是比贪婪模式多个?如{3,6}?则出现如下的匹配23678951

6字符边界

---(本组标记匹配的不是字符还是位置,符合某种条件的位置)

^:与字符串开始的地方匹配(注意不在中括号里面)^i表示第一行第一个字符为i

$:与字符串结束的地方匹配$i(表示行的最后一个字符为i)

匹配一个单词边界

-匹配这样一个位置:前面的字符和后面的字符不全是w比如匹配字符liulei则对于12liulei12不可以匹配(两边全部是w)而liulei33可以匹配

IGNORECASE 忽略大小写模式

  正常情况下,正则表达式是要区分大小写的

SINGLELINE单行模式

整个文本看做一个字符串,只有一个开头,一个结尾。

使小数点.”可以匹配包含换行符在内的任意字符

MULTITLE 多行模式

每行都是一个字符串,都有开头和结尾

在指定了一个字符串后,都有开头和结尾

在指定了MULTITLE之后,如果需要仅匹配字符串开始和结束的位置,可以使用A

 

7选择符和分组

|(分支结构)左右两边表达式之间“或”关系,匹配左边或者右边

比如: a|b则可以匹配字母a或者b。。。。。。。。。

()(捕获组)(1)在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰(2)取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到(3)每一次括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号,捕获元素为零的第一个捕获是由整个正则表达式模式匹配的文本

?:Expression)一些表达式中,不得不使用(),但又不需要保存()中表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用,(匹配到的内容并不保存,好处是不占内存)

反向引用( n):

-每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。

-通过反向引用,可以对分组已经捕获的字符串进行引用

比如([a-z]{2}1表示连续的两个az之间的字母然后捕获的内容再重复一次比如gogogo捕获再反向引用捕获的内容一次即最后捕获gogo

8预搜索(零宽断言)

?=exp)断言自身出现的位置的后面能匹配表达式exp

[a-z]+(?=ing)可以匹配所有以ing结尾的单词

?<=exp)断言自身出现的位置的前面能匹配表达式exp

[a-z]+(?<=ing)可以匹配所有以ing开头的单词

?exp)断言自身出现的位置的后面不能匹配表达式exp

[a-z]+(?ing)不可以匹配所有以ing结尾的单词

?<!exp)断言自身出现的位置的前面不能匹配表达式exp

[a-z]+(?<!ing)不可以匹配所有以ing开头的单词

正则表达式的应用

1固定电话的匹配(由七到八位数字和下划线组成)

0371-23233325

010-2365323

则表达式如下

0d{2,3}-d{7,8}

2手机号的匹配

1[35789]d{9}

3邮箱的应用

1958966655@qq.com

Wcwecew163.com

则表达式如下

[w-]+@[a-z0-9A-Z]+(.[A-Za-z](2,4)(1,2))

下面是在eclipse里面实现正则表达式的一个demo,可以参考一下

package test;

import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo1 {
public static void main(String[] args) {
//在这个字符串中把数字找出来asfsdf23323
Pattern p=Pattern.compile("\d+");//p代表正则表达式,只不过要注意斜杠是两个
Matcher m=p.matcher("asfsdf%%&&**23323");//指定匹配的字符串
boolean yesorno=m.matches();//将整个字符序列与该模式匹配,因为有%&*所以返回false指针会移到出错的位置,下次从出错的位置继续向下找
//boolean yesorno2=m.find();//该方法扫描输入的字符序列,查找与该模式匹配的下一个子序列;
//System.out.println(yesorno2);
while(m.find()){
System.out.println(m.group());//把找到的内容返回
}
System.out.println(yesorno);
String str=m.replaceAll("#");//数字替换
System.out.println(str);
String str1="a2265c326d";
String []ar=str1.split("\d+");//以数字作为分界点进行切割;
System.out.println(Arrays.toString(ar));
Scanner s=new Scanner(System.in);
//int []array=new int[5];
String year;
while(true){
year=s.next();//验证用户输入的是数字。
//Pattern p1=Pattern.compile("^\d+");
Matcher mm=p.matcher(year);
boolean s1=mm.matches();
if(false){
System.out.println("请输数字");
}
else
break;

}

}
}

总结:学习正则表达式的时候把常用的几个记住理解就行,当我们需要用的时候再翻阅笔记,并希望大家可以多用一下RegexBudd这个软件练习正则,

而且正则表达式是学习爬虫的基础。

原文地址:https://www.cnblogs.com/henuliulei/p/9332367.html