黑马程序员——正则表达式

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

正则表达式:符合一定规则的表达式 
作用:用于操作字符串 
特点:用一些特定的符号来表示一些代码数据,简化书写 
缺点:复杂的正则表达式阅读行极差

基本功能: 
1、匹配:s.matches(regex)

2、切割:s.split(regex); 
重点:如何切割 . 和 \ (反斜杠) 
根据叠词切割:”abcddiujffmnpoijjsdf”

3、替换:s.replaceAll(regex,newString) 
重点:”$1”获取上一个字符串中第一组的内容

4、获取:将字符串中符合的子串取出 
获取步骤: 
String regex =”正则表达式…”; 
1、把正则表达式封装成对象 
Pattern p = Pattern.compile(regex) 
2、正则对象和要操作的字符串相关联 
3、关联后,获取正则匹配引擎 
Matcher m = p.matcher(s) 
4、通过引擎对符合规则的子串进行取出 
while (m.find()) {// 类似iterator,匹配则返回数据 
//必须要先调用find(),否则报错 
System.out.println(m.group()); 
}

书写规范 
例:[][][]有几个中括号代表匹配几个字符(匹配3个字符) 
[abc] 这个字符上只能是a、b、c中的一个 
[^abc] 这个字符匹配出了abc之外的所有字符 
[a-zA-Z0-9]这个字符匹配a-zA-Z0-9的字符 
[a-d[m-p]]这个字符匹配a-d或者m-p 
[a-z&&[def]]这个字符匹配a-z和def的交集:就是def 
[a-z&&[^dc]]这个字符匹配a-z和除了dc的字符 
[a-z&&[^m-p]]这个字符匹配a-z和除了m-p的字符:就是a-l和q-z

预定义字符 
. 代表任意字符:在字符串中表示无意义的点 . 要:\. 来表示一个无意义的点 
\d:数字[0-9] 
\D:非数字[^0-9] 
\s:空白字符 
\S:非空白字符 
\w:单词字符[a-zA-Z0-9_]又包含下划线,没有$符号 
\W:非单词字符 
\b:单词边界符,例如空格 
\B:非单词边界 
^:行开头 
$:行结尾

次数代表 
\d?:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或1次 
\d*:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或多次(最多不限) 
\d+:后面的字符跟\d条件匹配,并且后面的字符可以出现1次或多次(最少一次) 
\d{n}:后面的字符跟\d条件匹配,并且后面的字符刚好出现n次 
\d{n,}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多不限 
\d{n,m}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多m次

字符串的所有正则方法都可以使用patten获取正则表达式对象 
然后关联字符串,通过matcher来调用相关方法 
String类中的matches()split()和relaceAll()底层都是调用patten和matcher来实现

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class RegexDemo {

 

    publicstatic void main(String[] args) {

       "// matches();// 字符串匹配"

       "// split();// 字符串切割"

       "// replace();// 替换"

       "// get();// 获取子串"

       netMethos();"// 网络爬虫"

    }

 

    "/**

    * 字符串匹配

    * 匹配是匹配整个字符串,当有一个字符不符合规则就立即结束,并返回false

    */"

    publicstatic void matches() {

       "// 手机号码,13...,15...,18...,长度为11位,全部是数字"

       String phone = "1334567a910";

       String phoneRegex = "1[358]\\d{9}";

       "// qq号码,不能0开头,不能有字母,长度5-15之间"

       String qq = "124633354";

       String qqRegex = "[1-9]\\d{4,14}";

       boolean b = phone.matches(phoneRegex);

       boolean c = qq.matches(qqRegex);

       System.out.println(b);

       System.out.println(c);

    }

 

    "/**

    * 字符串切割

    * 切割匹配的是要切割的字符,也就是要匹配切割的条件

    * 当一个字符不满足切割条件时会继续对下一个字符进行判断,直到字符串结束

    *

    * 叠词切割

    * (.)\\1+ :():括号内是匹配的字符,并封装成一个组,自动有编号从1开始

    * \\1是对第一组的内容 进行重用 ,**是匹配后的内容**

    * +:这个内容出现一次或多次

    * (a(b(c))(d)):有几个组,看左边括号  组的编号,看左边括号

    */"

    publicstatic void split() {

       "// 叠词切割"

       String s = "好ww好学rrrr习,天fffff天ff向dddd上";

       String regex = "(.)\\1+";

       method(s, regex);

       "// 切割点 ."

       String s1 = "好..好学.....习,天...天....向...上";

       String regex1 = "\\.";

       method(s1, regex1);

       "// 切割路径"

       String s2 = "c://demo//demo.txt";

       String regex2 = "\\/\\/";

       method(s2, regex2);

    }

 

    publicstatic void method(String s, String regex) {

       String[] end = s.split(regex);

       for (String t : end) {

           System.out.print(t + " ");

       }

    }

 

    "/**

    * 替换

    * c.replaceAll(regex1, "$1");

    * $1,是使用上一个字符串的中  组1  的内容

    * 两个字符串要在一个括号内才能使用$

    */"

    publicstatic void replace() {

       String s = "我我我..我我我......要要要要要..要要要..编编编编编编编编编...编编....程程程程程程程程";

       String regex = "\\.";

       String c = s.replaceAll(regex, "");

       System.out.println(c);

       String regex1 = "(.)\\1+";

       String d = c.replaceAll(regex1, "$1");

       System.out.println(d);

    }

 

    "/**

    * 获取匹配的子串

     */"

    publicstatic void get() {

       String s = "11112312ssssspodtdfffoooo";

       String regex = "(.)\\1{2,}";

       Pattern p = Pattern.compile(regex);"// 封装正则表达式为对象"

       Matcher m = p.matcher(s);"// 关联字符串并返回匹配引擎,操作引擎来获取数据"

       while (m.find()) {"// 类似iterator,匹配则返回数据"

           System.out.println(m.group());

       }

    }

 

    "/**

    * 网页爬虫

    *

    * "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+"

    * \\w{5,15}单词最少出现5次,最多15次

    * @

    * \\w+ 出现一次或多次

    * (\\.[a-zA-z]{2,3})+

     * 对组进行重用

    */"

 

    publicstatic void netMethos() {

       try {

           String regex = "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+";

           Pattern p = Pattern.compile(regex);

           URL url = new URL("http://127.0.0.1:8080/demo.txt");

           HttpURLConnection conn =(HttpURLConnection) url.openConnection();

           conn.setRequestMethod("GET");

           conn.connect();

           BufferedReader br = new BufferedReader(new InputStreamReader(

                    conn.getInputStream(), "UTF-8"));

           String line = null;

           while ((line = br.readLine()) != null) {

                Matcher m = p.matcher(line);"//字符串与正则表达式进行绑定"

                while (m.find()) {"// 遍历输出"

                   System.out.println(m.group());

                }

           }

       } catch (MalformedURLException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

}

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值