正则表达式基础知识
定义:符合一定规则的表达式
作用:由于专门操作字符串。
特点:用于一些特定的符号来表示一次代码,这样做简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
所以说学习正则表达式,就是学习一些特殊符号的使用。
具体操作功能
1.匹配:String matches方法
2.切割:String split方法
3.替换:String replaseAll方法
在替换过程中在组的外面可以$来用前面的组,比如replaceAllDemo(str,"(.)\\1+","$1"); 后面的$1就是引用的前面的组中的内容解释 replaceAllDemo(String str,String reg,String newStr)
{//去字符串中连续重复的字符替换为一个该字符。
str= str.replaceAll(reg,newStr);
}
注意
"."->"\\."叠词-->"(.)\\1+" 用括号括()起来则将封装成一个组。组的出现都是有编号的,编号从1开始
想要使用组可以通过\n (n就是组的编号)的形式来获取。
怎么区分几个组?从左向右从1开始数左括号,是几则这个组的编号就是几.
在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
4.获取:将字符串中符合规则的子串取出
操做步骤1.将正则表达式封装成对象
2.让正则对象和要操作的字符串相关联。
3关联后,获取正则匹配引擎。
4.通过引擎对符合规则的子串进行操作,比如取出。
例子
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
/**获取:将字符串中符合规则的子串取出
* 操做步骤
* 1.将正则表达式封装成对象
* 2.让正则对象和要操作的字符串相关联。
* 3关联后,获取正则匹配引擎(匹配器)。
* 4.通过引擎对符合规则的子串进行操作,比如取出。
* @param args
*/
public static void main(String[] args) {
getDemo();
}
public static void getDemo(){
String str= "ming tian jiu yao fang jia le. ";
String reg= "\\b[a-z]{3}";// \\b是单词边界匹配
//将规则封装为对象;
Pattern p = Pattern.compile(reg);
//让正则对象和要操作的字符串相关联。获取匹配器。
Matcher m = p.matcher(str);
System.out.println(m.matches());
//其实String类matchers用的就是Pattern和Matcher对象来完成的
//只不过被String的方法封装后,用起来较简单,但是功能却单一。
//Boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
//System.out.println(b);
//System.out.println(m.group());//用于获取匹配后的结果。
while (m.find())
{
System.out.println(m.group());
}
}
}
这四种功能如何选择呢?
思路方式1.如果只想知道该字符是否是对是错。使用匹配
2.想要将已有的字符串变成另一个字符串,替换
3.想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
4.想要拿到符合需求的字符串子串,获取。获取符合规则的子串
练习
将ip地址进行地址段顺序排序
192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30思路
还按照字符串自然顺序,只要将它们的每一段都是三位即可。
1.按照每一段粗腰的最多的0补齐,那么每一段就会至少保证有三位。
2.将每一位只保留三位。这样,所有的ip地址都是每段三位。
import java.util.TreeSet;
public class IPSortDemo {
/**将ip地址进行地址段顺序排序
192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30
思路
还按照字符串自然顺序,只要将它们的每一段都是三位即可。
1.按照每一段粗腰的最多的0补齐,那么每一段就会至少保证有三位。
2.将每一位只保留三位。这样,所有的ip地址都是每段三位。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ipsort();
}
public static void ipsort()
{
String ip ="192.68.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";
String rex ="\\d+";
ip= ip.replaceAll("(\\d+)", "00$1");
System.out.println("ip::"+ip);
//ip::00192.0068.001.00254 00102.0049.0023.0013 0010.0010.0010.0010 002.002.002.002 008.00109.0090.0030
ip=ip.replaceAll("0*(\\d{3})", "$1");
System.out.println("ip1::"+ip);
String [] arr = ip.split(" +");
TreeSet<String> ts =new TreeSet<String>();
for(String s: arr)
{
//去零
s=s.replaceAll("0*(\\d+)", "$1");
System.out.println(s);
}
}
}
-----------------------------------------------------
从文件获取邮件地址代码
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class getMailTest {
/**网页爬虫
* 获取指定文档的邮箱地址
* 使用正则表达式的获取功能 。Pattern Matcher
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
getMail();
}
public static void getMail() throws Exception
{
BufferedReader bufr = new BufferedReader(new FileReader("c:\\abc.txt"));
String line = null;
String mailReg ="\\w+@\\w+(\\.\\w+)+";
Pattern p =Pattern.compile(mailReg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
System.out.println(m.group());
}
}
}