黑马程序员 正则表达式

-----------android培训java培训、java学习型技术博客、期待与您交流! -----------


正则表达式:符合一定规则的表达式。

作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码操作

好处:简化对的字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。

正则:
字符类:
[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&&[^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] 
边界匹配器 
^ 行的开头 
$ 行的结尾 
\b 单词边界 
\B 非单词边界 
\A 输入的开头 
\G 上一个匹配的结尾 
\Z 输入的结尾,仅用于最后的结束符(如果有的话) 
\z 输入的结尾 
Greedy 数量词 
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
组的概念:
将规则用()括起来,实现结果被重用。重用某个组\n(组的编号)。
$用来获取组中的内容。


四种常见使用功能:
1,判断匹配:
使用String类中的matches()方法。

eg:对数字进行校验
要求:5~15位,0不能开头,只能是数字。
public static void checkNum()
{
	String num = "278197398";
	String regex = "[1-9][0-9]{4,14}";
	System.out.println(num.matches(regex));
}

2,切割
String类中的split()方法
eg:
public static void splitDemo()
{
	String str = "1111.....2222..333";
	String reg = "\\.+";
	String[] sarr = str.split(reg);
	for(String s : sarr)
	{
		System.out.println(s);
	}
}
eg:按照叠词切割
public static void splitDemo()
{
	String str = "ajsflaasjlfffflo";
	String reg = "(.)\\1+";
}

3,替换
String类中的replaceAll()方法
eg:将字符串中的连续5个以上的数字替换成*.
public static void replaceDemo()
{
	String str = "dsafw2492739ksdjfl123";
	String reg = "\\d{5,}";
	str = str.replaceAll(reg,"#");
}
eg:将字符串中的重叠的字符替换成单个字符.
public static void replaceDemo()
{
	String str = "dsafw24999kksdddjfl13323";
	String reg = "(.)\\1+";
	str = str.replaceAll(reg,"$1");
}
4,提取:将符合规则的字串取出。
  (1)定义正则规则:String reg = "";
  (2)将正则规则封装成对象:Pattern p =Pattern.compile(reg);
  (3)将正则对象和需作用的字符串关联,并获取匹配器对象:
Matcher m = p.matcher(str);
  (4)尝试查找,返回boolean值,m.find();只负责查找,不负责返回查找结果。
     返回匹配的子序列:m.group();该方法获取一次,里面有指针进行移位。只负责返回查找的结果,不负责查找。
eg:
public static void getDemo()
{
	String str = "zheng ze de li zi,haa hahaha";
	String reg = "\\b[a-z]{3}\\b";
	Pattern p = Pattern.compile(reg);
	Matcher m = p.matcher(str);
	while(m.find())
	{
		System.out.println(m.group());
		//获取字串的字符索引位置
		System.out.println(m.start()+"..."+m.end());
	}
}
eg:将IP地址进行地址段顺序排序。
思路:
1,将每一段地址前面补两个0,使每一段的地址都至少有3位。
2,将每一段只保留3位。
public static void getIP()
{
	String ip = "192.168.1.1 192.83.8.123 10.10.10.01 1.1.1.1 3.124.1.11";
	ip = ip.replaceAll("(\\d+)","00$1");
	ip = ip.replaceAll("0*(\\d{3})","$1");
	System.out.println(ip);
	String[] arr = ip.split(" ");
	TreeSet ts = new TreeSet();
	for(String str:arr)
	{
		ts.add(str);
	}
	for(String s:ts)
	{
		System.out.println(s.replace("0*(\\d+)","$1"));
	}
}

eg:对邮件地址进行校验
public static void checkMailAddress()
{
	String mail = "sfsaf@163.com";
	String reg = "\\w+@\\w+(\\.\\w+){1,3}";
	System.out.println(mail.matches(reg));
}

eg:网页爬虫
class Regex
{
	public static void main(String[] args)
	{
		getMails();
	}
	public static void getMails()throws Exception
	{	
		String reg = "\\w+@\\w+(\\.\\w+){1,3}";
		Pattern p = Pattern.compile(reg);
		//获取某网页中的内容
		URL url = new URL("http://bbs.tianya.cn/post-tybooks-61477-3.shtml");
		URLConnection conn = url.openConnection();
		BufferedReader bufin = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		
		//BufferedReader bufr = new BufferedReader(new FileReader("网页爬虫.txt"));
		PrintWriter pw = new PrintWriter(new FileWriter("mails.txt"));//将获取到的邮箱装到文件中。
		String line = null;
		while((line=bufin.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				pw.println(m.group());
			}
		}
		
	}
}


-----------android培训java培训、java学习型技术博客、期待与您交流! -----------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值