博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

正则表达式

Posted on 2021-12-17 14:21  心默默言  阅读(53)  评论(0编辑  收藏  举报

1.入门案例

2.macher.find()底层实现原理

 

package regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regexp1 {

    public static void main(String[] args) {
        String content = "1995aaa年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,"
                + "这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,"
                + "Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,";

        // 匹配文中所有单词,输出:找到:Oak 找到:IT 找到:Sun
        Pattern compile = Pattern.compile("[a-zA-Z]+");
        // 匹配文中所有数字,输出:找到:1995
        // Pattern compile = Pattern.compile("[0-9]+");
        // 匹配数字或者单词
        // Pattern compile = Pattern.compile("([0-9]+)([a-zA-Z]+)");
        // 2.创建一个匹配器对象
        Matcher matcher = compile.matcher(content);
        // 3. 可以循环匹配
        while (matcher.find()) {
            // 匹配内容,文本,放到 m.group(0)
            System.out
                    .println("找到:" + matcher.group(0) + "     start:" + matcher.start(0) + "    end:" + matcher.end(0));
        }
    }

}

 

3.分组

 

4.正则表达式语法

 

 

 

 

 

5.关于正则表达式 \1 \2之类的问题

我们创建一个正则表达式
var RegExp = /^(123)(456)\2\1$/;
这个正则表达式匹配到的字符串就是
123456456123
创建另外第二正则表达式
var RegExp1 = /^(123)(456)\1$/;
这个正则表达式匹配到的字符串是
123456123
创建另外第三正则表达式
var RegExp1 = /^(123)(456)\2$/;
这个正则表达式匹配到的字符串是
123456456


这个\1 \2...... 都要和正则表达式集合()一起使用
简单的说就是
\1表示重复正则第一个圆括号内匹配到的内容
\2表示重复正则第二个圆括号内匹配到的内容

6.正则表达式中 的$1,$2

$1,$2表达的是小括号里面的内容

$1是第一个小括号里的内容,$2是第二个小括号里面的内容,依此类推

比如(\\d{4})(\\d{2})(\\d{2})  匹配"20190919"

$1是第一个括号里匹配的2019

$2是第二个括号里匹配的09

$3是第三个括号里匹配的19

 

package regexp;

import java.awt.geom.Rectangle2D;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regexp1 {

    public static void main(String[] args) {
        String content = "我我我……我我……爱…爱爱……学…学……学编程";

        /*练习1:对输入的qq号进行匹配(qq匹配规则:长度为5-10位,纯数字组成,且不能以0开头。)*/
        // String reg = "^[1-9]\\d{4,9}";

        /*练习2:对输入的电话号码进行匹配(匹配要求:匹配成功的电话号码位数为11位的纯数字,且以1开头,第二位必须是:
        3、7、8中的一位,即只匹配13*********、17*********、18*********的电话号码)。*/
        // String reg = "^1[378]\\d{9}";
        // regexp(content, reg);

        /*练习3:对字符串“张三@@@李四@@王五@茅台”进行切割,去掉@符号。*/
        // String reg = "@+";

        /*练习4:【以叠词切割】:如字符串"abccsasahhhz"按“叠词”来切割就变成了“ab”,“sasa”,“z”。因为“cc”、“hhh”都是叠词,需要切割掉。
         * 现在请将字符串“张三@@@李四¥¥王五ssssssss江流儿”按照叠词切割。*/
        // 注:\\1要和分组一起使用,表示重复第一个括号里面的内容;同理,\\2表示重复第二个括号里的内容
        // String reg = "(.)\\1+";
        // regexpSplit(content, reg);

        /*练习5:将字符串“张三@@@李四YYY王五*****王尼玛”中的叠词替换为:“、”。*/
        // String reg = "(.)\\1+";
        // regexpReplace(content, reg, "、");

        /*练习6:将“张三@@@李四YYY王五*****王尼玛”中的叠词替换为单字符,即结果为:“张三@李四Y王五*王尼玛”。
        */
        // String reg = "(.)\\1+";
        // regexpReplace(content, reg, "$1");

        /*练习7:获取字符串“Hi ! Don't be moved by yourself Fzz”中为两个字母的单词。即Hi、be、by。
          分析:根据上面的步骤:
          第一步,我们要对子串进行匹配,即两个字母的单词,字母可以用[a-zA-Z]来表示,范围是两个,所以regex = "[a-zA-Z]{2}"。
        但这样不够准确,我们需要的是单词,而不是三个字母,所以要用到“边界匹配器”,即
        */
        // String reg = "\\b[a-zA-Z]{2}\\b";
        // regexp(content, reg);

        /*练习8:口吃怎么办?需求:请将下面的字符串“我我我……我我……爱…爱爱……学…学……学编程”改为:“我爱学编程”。
         * 分析:首先我们可以将字符串中的“……”去掉,然后就可以将叠词替换为单个汉字即可。
        */
        // String reg = "…+";
        // String res_content = regexpReplace(content, reg, "");
        // System.out.println(res_content);
        //
        // String reg2 = "(.)\\1+";
        // String res2 = regexpReplace(res_content, reg2, "$1");
        // System.out.println(res2);
        
    }

    // 正则表达式匹配
    public static void regexp(String content, String reg) {
        Pattern compile = Pattern.compile(reg);
        Matcher matcher = compile.matcher(content);
        while (matcher.find()) {
            System.out.println("找到:" + matcher.group(0));
        }
    }

    // 正则表达式截取
    public static void regexpSplit(String content, String reg) {
        String[] arr = content.split(reg);
        for (String s : arr) {
            System.out.println(s);

        }
    }

    // 正则表达式替换
    public static String regexpReplace(String content, String regex, String replacement) {
        String res = content.replaceAll(regex, replacement);
        // System.out.println(res);
        return res;
    }

}