-----------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());
}
}
}
}