字符串:String支持正则表达式的方法
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。

正则表达式的基本知识
.(句点符号)代表任意一个字符 eg: c.t 可以匹配cat,cot,c#t,但不能匹配caat
[](句点符号)只有方括号里面指定的字符才参与匹配
eg:表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符
|(“或”符号)结合()使用,代表或者的关系。eg:“t(a|e|i|o|oo)n” 可以匹配 tan,ten,tin,ton,toon.
() 分组,将若干部分字符串作为一个整体进行操作 abc{10} (abc){10} ,每个组还会有一个编号

表示匹配次数的符号
*:代表0次或多次。
+:代表1次或多次
?:0次或1次
{n}:恰好出现n次
{n,m}:出现n次到m次
{n,}:至少出现n次
eg: [0-9]{3}\-[0-9]{2}\-[0-9]{4} 匹配:3位数字-2位数字-4位数字(999-99-9999)

“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。
eg:[^x][a-z]{4}:5为字母,首字母不能是x,其余字母在a-z范围中

常用符号:
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符: [a-zA-Z_0-9] 大小写a-z的字母,下划线,0-9数字 eg:\w{8,20}:可以匹配字母,数字和下划线并且长度在8到20位之间
\W 非单词字符:[^\w]

匹配IP地址的正则表达式: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 注意".为要匹配字符不是通配符,所以需要使用转义符\"
匹配手机号码的正则表达式:1[3578]\d{9}

public class TestRegex {
    /**
     * 使用字符串方法校验QQ是否合法
     * @param qq
     */
    public static void  checkQQ(String qq){
        int len = qq.length();
        if(len>=5&&len<=11){
            if(!qq.startsWith("0")){
                boolean flag=true;
                for(int i=0;i<len;i++){
                    char c = qq.charAt(i);//获取指向下标的字符
                    if(c<'0'||c>'9'){
                        flag=false;
                        break;
                    }
                }
                if(flag){
                    System.out.println("QQ号码合法!");
                }else{
                    System.out.println("QQ号码不合法!");
                }
            }else{
                System.out.println("QQ号码不合法!");
            }
        }else{
            System.out.println("QQ号码不合法!");
        }
    }
    
    public static void checkQQ2(String qq){
        String regex="[1-9][0-9]{4,10}";
        boolean isCorrect= qq.matches(regex);//将指定字符串与正则表达式进行匹配,匹配成功返回true,否则返回false
        System.out.println(isCorrect?"QQ号码合法!":"QQ号码不合法!");
    }
    
    public static void checkMobile(String mobile){
        String regex="1[3578]\\d{9}";
        boolean isCorrect= mobile.matches(regex);//将指定字符串与正则表达式进行匹配,匹配成功返回true,否则返回false
        System.out.println(isCorrect?"手机号码合法!":"手机号码不合法!");
    }
    
    public static void main(String[] args) {
//        checkQQ("123456");
//        checkQQ2("123456");
        checkMobile("18512341678");
    }
}

 

/**
 * 字符串:String支持正则表达式的方法
 *  boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。 
 * 
 * 数据校验
 * 1.验证固定电话号码
 *    3位区号+7位|8位电话号码    区号以0开头
 *    4位区号+7位|8位电话号码
 *    010-12345678  01012345678
 *    0371-1234567    03711234567
 *    1234567
 *    正则:0\d{2,3}\-?\d{7,8}
 * 2.验证邮箱格式
 *   邮箱的后缀:@qq.com @sohu.com  @126.com @163.com @sina.com.cn yunzhen_yang@163.com yangyunzhen@sxt.cn
 *    123456@qq.com zhangsan@suho.com  zhangsan@163.com 
 *   用户部分: \w{4,20}
 *   @ 后的公司域名部分:[a-z0-9]{2,6}
 *   顶级域名部分:.com ,.cn,.com.cn,.org,.edu...
 *   (.[a-z]{2,3})+  
 *   正则: \w{4,20}@[a-z0-9]{2,6}(\.[a-z]{2,3})+
 */
public class TestRegex2 {
    public static void checkTel(String tel){
        String regex="(0\\d{2,3})?\\-?\\d{7,8}";
        boolean is = tel.matches(regex);
        System.out.println(is?"电话号合法!":"电话号不合法!");
    }
    
    public static void checkEmail(String email){
        String regex="\\w{4,20}@[a-z0-9]{2,6}(\\.[a-z]{2,3})+";
        boolean is = email.matches(regex);
        System.out.println(is?"邮箱格式合法!":"邮箱格式不合法!");
    }
    
    public static void main(String[] args) {
//        checkTel("01077777777");
        checkEmail("zhang#san@sina.com.cn");
    }
}
/**
 * 字符串:String支持正则表达式的方法
 *  ***boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。 
 *  replaceAll(String regex, String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
 *  replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
 *  split(String regex)根据给定正则表达式的匹配拆分此字符串。
 */
public class TestRegex3 {
    
    public static void main(String[] args) {
//        String string="我的名字叫zhangsan,我的QQ12345,我的电话1234567";
//        String regex="\\d";
//        string = string.replaceAll(regex, "#");
//        string = string.replaceFirst(regex, "#");
//        System.out.println(string);
        String string="java,oracle,,html,,,,css,,,,,javascript,,jsp";
//        String[] strs = string.split(",");
        String regex=",+";
        String[] strs = string.split(regex);
        for (String str : strs) {
            System.out.println(str);
        }
    }
}
/**
 * ***boolean matches():将整个区域与正则表达式进行匹配
 * **boolean find():尝试查找与该模式匹配的输入序列的下一个子序列
 * **String group():返回由以前匹配操作所匹配的输入子序列
 * boolean lookingAt():将开始的字符序列进行匹配
 * int start()返回匹配成功后的第一个字符串出现的位置
 * int end()返回匹配成功后的最后一个字符串出现的位置 
 *
 */
public class TestLookingAt {
    public static void main(String[] args) {
        Pattern p=Pattern.compile("([a-z]+)(\\d+)"); 
        Matcher m=p.matcher("aaa2223bb"); 
        System.out.println(m.find());   //匹配aaa2223 
        System.out.println(m.groupCount());   //返回2,因为有2组 
        System.out.println(m.start(1));   //匹配aaa,返回0 返回第一组匹配到的子字符串在字符串中的索引号 
        System.out.println(m.start(2));   //匹配2223,返回3 
        System.out.println(m.end(1));   //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置. 
        System.out.println(m.end(2));   //返回7 
        System.out.println(m.group(1));   //返回aaa,返回第一组匹配到的子字符串 
        System.out.println(m.group(2));   //返回2223,返回第二组匹配到的子字符串 
        System.out.println("----------------------");
        Pattern p2=Pattern.compile("\\d+"); 
        Matcher m2=p2.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com"); 
        while(m2.find()) { 
             System.out.println(m2.group()); 
        } 
    }
}
/**
 *在java中提供了两个类用于正则表达式的匹配和查找
 *java.util.regex.Pattern类:正则表达式的编译表示形式。 
 *    Pattern无构造函数,不能使用new关键字创建对象
 *常用方法:
 *  compile(String regex)将给定的正则表达式编译到模式中。
 *  matcher(CharSequence input)创建匹配给定输入与此模式的匹配器。
 *  Pattern.matcher(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
 *  
 *java.util.regex.Matcher类: 通过解释 Pattern对字符串执行匹配操作的引擎
 *    Matcher类无构造函数,不能使用new关键字创建对象,只能通过Pattern中matcher方法获取实例
 *常用方法:
 *  boolean matches() 尝试将整个区域与模式匹配。  如果匹配成功返回true,否则返回false
 *  boolean lookingAt()   对字符串进行匹配,匹配到的字符串可以在开始位置.  
 *  boolean find() 对字符串进行匹配,匹配到的字符串可以在任何位置.  
 *  
 *  start()返回匹配到的子字符串在字符串中的索引位置. 
    end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. 
    group()返回匹配到的子字符串 

 */
public class TestMatches {
    public static void main(String[] args) {
        //1.创建Pattern对象
//        Pattern  pattern = Pattern.compile("[1-9][0-9]{4,10}");
//        //2.使用Pattern对象中的方法创建Matcher
//        Matcher  matcher =  pattern.matcher("100010");
//        //3.调用Matcher类中的matches()进行匹配,匹配成功返回true
//        boolean is= matcher.matches();
        //第二种写法:Pattern.matcher(String regex,CharSequence input)
        boolean is = Pattern.matches("[1-9][0-9]{4,10}", "100010");
        System.out.println(is?"QQ号码合法":"QQ号码不合法");
    }
}
/**
 *使用正则表达式实现一个网络爬虫
 * <a href="http://yuedu.163.com/#f=topnav"></a>
 * href="http://yuedu.163.com/#f=topnav"
 * 正则表达式:http://\\w+\\.\\d+\\.com
 *
 */
public class WebSpider {
    public static void main(String[] args) throws Exception{
        URL url = new URL("http://www.163.com");
        BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
        StringBuffer sb = new StringBuffer();
        String str;
        while((str=br.readLine())!=null){
            sb.append(str);
        }
//        System.out.println(sb);
        Pattern pattern = Pattern.compile("http://\\w+\\.\\d+\\.com");
//        Pattern pattern = Pattern.compile("^((https|http|ftp|rtsp|mms)?:\\/\\/)[^\\s]+");
        Matcher matcher = pattern.matcher(sb);
//        System.out.println(matcher.find());
        while(matcher.find()){
            String subURL = matcher.group();
            System.out.println(subURL);
        }
        br.close();
    }
}