黑马程序员——Java语言基础——09.正则表达式
2014-12-20 10:29
495 查看
------- android培训、java培训、期待与您交流!
----------
1-1 正则表达式概述
正则表达式:符合一定规则的表达式。作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
1-2 常用预定义类
java中正则表达式工具在java.util.regex包中。字符类 | |
---|---|
[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] |
边界匹配器 | |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
1-3 常用操作
1-3-1 匹配
String类中的matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
匹配示例:
class RegexDemo { public static void main(String[] args) { matchMail(); } //匹配QQ号 public static void match() { String s1 = "12344533333"; String regex = "[1-9][0-9]{4,10}"; if (s1.matches(regex)) { System.out.println("qq is right"); } else { System.out.println("qq is wrong"); } } //匹配手机号 public static void matchPhone() { String s1 = "16799990000"; String regex = "[1][358]\\d{9}";//反斜杠,不是斜杠 if (s1.matches(regex)) { System.out.println("PhoneNumber is right"); } else { System.out.println("PhoneNumber is wrong"); } } //匹配邮箱 public static void matchMail() { String s1 = "22e@qq.com"; String regex = "\\w+@\\w+(\\.[A-Za-z]+)+"; if (s1.matches(regex)) { System.out.println("Mail is right"); } else { System.out.println("Mail is wrong"); } } }<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> </span>
1-3-2 切割
String类中的split方法。切割示例:
class RegexSplit { public static void main(String[] args) { split4(); } //切割多个空格 public static void split1() { String s1 = "ni si sjidaj s"; String regex = " +"; String[] s2 = s1.split(regex); for (String s : s2) { System.out.println(s); } } //切割.因为.是所有字符的通配符,所以必须\转义,反斜杠必须同时出现一对 public static void split2() { String s1 = "ni.si.sj.is"; String regex = "\\."; String[] s2 = s1.split(regex); for (String s : s2) { System.out.println(s); } } //切割反斜杠 public static void split3() { String s1 = "ni\\si\\sj\\is";//字符串中出现反斜杠必须同时出现两次 String regex = "\\\\";//因此切割双斜杠也必须出现两次*2 String[] s2 = s1.split(regex); for (String s : s2) { System.out.println(s); } } //切割叠词 public static void split4() { String s1 = "niaashhskkd"; String regex = "(\\w)\\1+"; String[] s2 = s1.split(regex); for (String s : s2) { System.out.println(s); } } }
1-3-3 替换
String类中的replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组
组:
用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。
(aaa(wwww(ccc))(eee))有几个组?
小技巧,从左括号开始数,有几个左括号就是几组。
替换示例:class RegexReplace
{
public static void main(String[] args)
{
replace2();
}
public static void replace1()
{
String s1 = "ndfbai1213243ubfi545644ab";
String regex = "[\\d]{4,}";
String s2 = s1.replaceAll(regex,"****");
System.out.println(s2);
}
public static void replace2()
{
String s1 = "ndfbai22222ubfidddddddab";
String regex = "(\\w)\\1+";
//
// String s2 = s1.replaceAll(regex,"*");
String s2 = s1.replaceAll(regex,"$1$1");//美元符号有特殊含义,$1表示获取符合前一个组中的符号,在外面获取组
System.out.println(s2);
}
}
1-3-4 获取
将字符串中的符合规则的子串取出。操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
class RegexGet
{
public static void main(String[] args)
{
get1();
}
public static void get1()
{
String s1 = "dni sjj shhd ssii dai";
String regex = "\\b[a-zA-Z]{3}\\b";
//将regex封装成对象
Pattern p = Pattern.compile(regex);
//将Pattern对象与字符串关联,并获取匹配器对象
Matcher m = p.matcher(s1);
while(m.find())//先找到符合要求的子串
{
String s2 = m.group();//返回之前匹配的子串
System.out.println(s2);
System.out.println(m.start()+" "+m.end());
}
}
}
1-4 正则表达式练习
需求1:将下列字符串转成:我要学编程."我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"
到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
public class StringReplace {
public static void main(String[] args) {
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
String temp = str.replaceAll("\\.+", "");//将.替换为空字符
System.out.println(temp);
String d = temp.replaceAll("(.)\\1+", "$1");//美元符号取前一个组中的内容
System.out.println(d);
}
}
需求2:将下列ip地址进行地址段顺序的排序。
192.68.1.254
102.49.23.13
10.10.10.10
2.2.2.2
8.109.90.30
按照字符串自然顺序,只要让它们每一段都是3位即可。
1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。
import java.util.TreeSet;
public class RegexDemo {
public static void main(String[] args) {
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
String ip1 = ip.replaceAll("(\\d+)", "00$1");//在所有数字前补两个0
String ip2 = ip1.replaceAll("0*(\\d{3})", "$1");//去除掉多余的一个0,所有数字都是三位
String[] ip3 = ip2.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for (String s : ip3)//存入TreeSet,排序
ts.add(s);
for(String s: ts)
System.out.println(s.replaceAll("0*(\\d+)", "$1"));//去除掉所有多余的0
}
}正则应用,网页爬虫获取网页邮箱
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
/*
获取指定文档中的邮件地址。
使用获取功能。Pattern Matcher
*/
public static void getMails()throws Exception
{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.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());
}
}
}
}
------- android培训、java培训、期待与您交流!
----------
相关文章推荐
- 黑马程序员-Java语言基础–正则表达式 第25天
- 黑马程序员 java基础之正则表达式
- 黑马程序员_Java基础_正则表达式
- 黑马程序员--JAVA基础复习之正则表达式
- 黑马程序员-Java基础、正则表达式
- 黑马程序员---JAVA基础--正则表达式(十六)
- 黑马程序员--java基础--正则表达式总结
- 黑马程序员_Java基础_正则表达式_25
- 黑马程序员——Java基础---正则表达式
- 黑马程序员---Java基础总结---正则表达式
- 黑马程序员_Java基础_正则表达式,校验QQ号,手机号,邮箱,IP地址排序,网络爬虫
- 黑马程序员---Java基础--25天(正则表达式)
- 黑马程序员 16 Java基础教学 - 16 - 正则表达式总结
- 黑马程序员_01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)
- 黑马程序员---java基础之正则表达式
- 黑马程序员__JAVA基础__正则表达式
- 黑马程序员——Java基础---正则表达式
- 黑马程序员—java基础之反射与正则表达式
- 黑马程序员——【Java基础】——正则表达式
- 黑马程序员-Java基础-正则表达式