第一种:1.定义匹配规则如:String qqreg = "[1-9]\\d{4,14}";
2.得到要匹配的字串如:String QQ = "123";
3.用String对象的matches()方法是匹配如:boolean b = QQ.matches(qqreg);
第二种:1.定义匹配规则如:String qqreg = "[1-9]\\d{4,14}";
2.将规则封装成对象如:Pattern p = Pattern.compile(qqreg );
3.用Pattern对象的matcher()方法匹配返回一个Matcher对象:Matcher m = p.matcher(str);
4.用Matcher对象的find()方法找是否有匹配:m.find()
5.用Matcher对象的group()方法拿出匹配的字串:m.group()
正则表达式:
是一种专门用于操作字符串的规则。
通过一些符号来表示,简化对字符串的复杂操作。
弊端:阅读性较差。
常见的操作:
1,匹配。String matches(regex)
2,获取(查找):Pattern , Matcher
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(String);
while(m.find())
{
System.out.println(m.group());
}
3,切割:String split(regex);
4,替换:String replaceAll(regex,str);
示例:
String regex = "\\d{5,}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(String);
while(m.find())
{
String s = m.group();
s.replaceAll(regex,"#");
}
网页爬虫:
通过网络以及IO读取网页的源文件,并通过规则获取网页中的符合规则的数据。
比如:mail爬虫。
String mailreg = "[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
正则表达式中组的含义:将部分进行封装以便重用。\\num 反向引用指定组。
示例:IP地址排序。
-------------------------------------
/*
正则表达式.
是一种规则,是一种操作字符串的规则。
1,匹配。String matches(regex)
2,获取匹配内容。
3,切割。
4,替换。
*/
import java.util.regex.*;
import java.util.*;
class RegexDemo
{
public static void main(String[] args)
{
// checkQQ2(args[0]);
String QQ = "123";
String qqreg = "[1-9]\\d{4,14}";
boolean b = QQ.matches(qqreg);
// System.out.println("qq="+b);
String tel = "14800001234";
String telreg = "1[35]\\d{9}";
boolean b1 = tel.matches(telreg);
// System.out.println("tel:"+b1);
String str = "da jia ming tian bu fang jia !";
String strreg = "\\b[a-z]{3}\\b";
// strreg = "\\b[a-z]*a[a-z]*\\b";
//1.将规则封装成对象。
Pattern p = Pattern.compile(strreg);
//2,要将规则作用到字符串上。因为符合规则的元素不唯一,
//所以将这些元素封装到了Matcher对象中。通过Matcher对象方法可以获取需要的数据。
Matcher m = p.matcher(str);
// while(m.find())
// System.out.println(m.group());
//切割:split();
String s = "sadfzzasqqqfsttttdf";
String[] arr = s.split("(.)\\1+");
for(String ss : arr)
{
// System.out.println(ss);
}
//替换 String replaceAll(regex,str);
String sreg = "(.)\\1+";
s = s.replaceAll("(.)\\1+","$1");
// System.out.println("s="+s);
// test_2();
checkMail();
}
public static void test_1()
{
String s = "我我.....我我我...我我.....要要要要....要要学...学学....学学...学编编编编...编编编...程程程....程";
s = s.replaceAll("\\.+","");
s = s.replaceAll("(.)\\1+","$1");
System.out.println("s="+s);
}
public static void test_2()
{
String ip = "192.168.1.254 10.10.10.10 2.2.2.2 66.105.88.10";
ip = ip.replaceAll("(\\d+)","00$1");
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
String[] arr = ip.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String s : arr)
{
ts.add(s);
}
for(String s : ts)
{
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
public static void checkMail()
{
String mail = "abc1@sina.com.cn";
mail = "1@1.1";
String mailreg= "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
mailreg = "\\w+@\\w+(\\.\\w+)+";
boolean ismail = mail.matches(mailreg);
System.out.println("mail:"+ismail);
}
/*
要求:
5~15,必须是数字,而且0不可以开头。
*/
public static void checkQQ(String qq)
{
int len = qq.length();
if(len>=5 && len <=15)
{
if(qq.startsWith("0"))
System.out.println("0不可以开头");
else
{
boolean b = true;
char[] arr = qq.toCharArray();
for(int x=0; x<arr.length; x++)
{
char ch = qq.charAt(x);
if(!(ch>='0' && ch<='9'))
{
b = false;
break;
}
}
if(b)
{
System.out.println("qq:"+qq);
}
else
{
System.out.println("出现非法字符");
}
}
}
else
{
System.out.println("长度错误");
}
}
public static void checkQQ2(String qq)
{
int len = qq.length();
if(len>=5 && len <=15)
{
if(qq.startsWith("0"))
System.out.println("0不可以开头");
else
{
try
{
Long l = Long.parseLong(qq);
System.out.println("qq:"+l);
}
catch (NumberFormatException e)
{
System.out.println("非法");
}
}
}
else
{
System.out.println("长度错误");
}
}
}