正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。
字符类
[abc] a、b或 c(简单类)
[^abc] 任何字符,除了 a、b或 c(否定)
[a-zA-Z] a 到 z或 A到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d或 m到 p:[a-dm-p](并集)
[a-z&&[def]] d、e或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n次
X{n,} X,至少 n次
X{n,m} X,至少 n次,但是不超过 m次
正则表达式的作用:
1.匹配字符串
2.切割字符串
3.替换字符串
4.获取:
a.将正则表达式封装成对象
b.让正则对象和要操作的字符串相关联
c.关联以后,获取正则匹配引擎
d.通过引擎对符合规则的字串进行操作,比如取出
一个简单的Demo:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo1 {
publicstatic void main(String[] args) {
Stringstr = "b";
Stringreg = "[a-zA-Z][0-9]";
//切割多个空格
splitDemo("zhang wang wan", " +");
//切割.
splitDemo("ada.agda.agdafe","\\.");
//切割文件
splitDemo("c:\\dafd\\ada.txt","\\\\");
//切割叠词
splitDemo("adfafzzzzzzzzzzzzzzsgegefewfewfwwwwwwwwwwwwwwwafda","(.)\\1+");
//将叠词替换成一个字符
replaceAllDemo("dafdaszzzzzzzzzzzzdafdadddddeweqdf","(.)\\1+","$1");
/*
* 获取
*/
Stringstri = "wo men ming tian fang jia le ,huo ban men ";
Stringregx = "\\b[a-z]{3}\\b";
Patternp = Pattern.compile(regx);
Matcherm = p.matcher(stri);
m.matches();
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+ "..........." + m.end());
}
}
publicstatic void replaceAllDemo(String str, String reg, String newStr) {
str= str.replaceFirst(reg, newStr);
System.out.println(str);
}
publicstatic void splitDemo(String str, String reg) {
String[] arr = str.split(reg);
for(Strings : arr) {
System.out.println(s);
}
}
}
应用情景一:
publicclassdemo1 {
publicstaticvoid main(String[] args) {
//将下列字符串变为:我要学编程
//思路:
//1.先去掉点
//2.将多个重复的内容变为单个
Stringstr = "我我...我我...我要...要要...要要...学学学...学学...编编编...编程...程...程...程...程";
str= str.replaceAll("\\.+","");
System.out.println(str);
str= str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
}
应用情景二:
import java.util.TreeSet;
publicclassdemo2 {
/*
* 192.168.1.254 102.49.23.013 10.10.10.102.2.2.2 8.109.90.30
* 将ip地址进行地址段顺序排序
*/
publicstaticvoid main(String[] args) {
//checkIp();
//
Stringmail = "wangjign@qq.com.cn.org";
//较为精确的匹配
Stringreg = "[a-zA-Z0-9_]{6,12}+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
//相对不太精确的匹配
Stringreg1 = "\\w+@\\w+(\\.\\w+)+";
System.out.println(mail.matches(reg));
}
privatestaticvoidcheckIp() {
Stringip = "192.168.1.254 102.49.23.01310.10.10.10 2.2.2.2 8.109.90.30";
ip= ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);
ip= ip.replaceAll("0*(\\d{3})","$1");
Stringstr[] = ip.split(" ");
TreeSet<String>tree = newTreeSet<>();
for(String s : str) {
tree.add(s);
}
for(String s : tree) {
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
}
应用情景三:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class demo3 {
//网页爬虫(蜘蛛)
publicstatic void main(String[] args) throws IOException {
getMails();
getMailsFromURL();
}
publicstatic void getMailsFromURL() throws IOException {
URLurl = new URL("www.sina.com");
URLConnectionconn = url.openConnection();
BufferedReaderbr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
Stringline = null;
StringmailReg = "\\w+@\\@(\\.\\w+)+";
Patternp = Pattern.compile(mailReg);
while((line= br.readLine())!= null) {
Matcherm = p.matcher(line);
while(m.find()){
m.group();
}
System.out.println(line);
}
}
publicstatic void getMails() throws IOException {
BufferedReaderbr = new BufferedReader(new FileReader("d:\\mail.txt"));
Stringline = null;
StringmailReg = "\\w+@\\@(\\.\\w+)+";
Patternp = Pattern.compile(mailReg);
while((line= br.readLine())!= null) {
Matcherm = p.matcher(line);
while(m.find()){
m.group();
}
System.out.println(line);
}
}
}