笔试题:正则表达式(三)

学计算机的秃头少女们今晚愉快地闲聊了一晚上,要不是实验室11点关门感觉我们还能继续奋战到天明2333。真实的快乐又焦虑,期间交流到面试手撕代码的时候聊到朋友的一个题,我觉得这个用正则表达式做很easy啊,赶紧来记录下。

              

用到matcher类的以下方法:

String group() 
  返回当前查找而获得的与组匹配的所有子串内容 
String group(int group) 
  返回当前查找而获得的与指定的组匹配的子串内容

代码写了如下:

public class Test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = 100;
        while(n>0){
            String str = in.nextLine();
            System.out.println(arrStr(str));
            n--;
        }
    }
    public static String arrStr(String str){
        String strRegex = "^(?<front>[a-z]*)(?<number>[1-9][0-9]*)\\%(?<repeat>[a-z]+)\\*(?<end>[a-z]*)$";
        Pattern pattern = Pattern.compile(strRegex);
        Matcher matcher = pattern.matcher(str);
        StringBuffer re = new StringBuffer();

        while (matcher.find()){
            String front = matcher.group("front");
            String number = matcher.group("number");
            String repeat = matcher.group("repeat");
            String end = matcher.group("end");
            String frontStr = front;
            int n = Integer.parseInt(number); //将字符串型转为数值型
            String repeatStr = repeat;
            String endStr = end;
            re.append(frontStr);
            for(int i=0;i<n;i++){
                re.append(repeatStr);
            }
            re.append("%");
            re.append(repeatStr);
            re.append("*");
            re.append(endStr);
        }

        return re.toString();
    }
}

运行结果如下:

但是在正则表达式里用转义字符识别%*这样的特殊字符的时候我突然想到split()不就是做这个用的嘛,跑去翻了下split源码,实现部分很简单,但是里面关于regex的也写得太复杂了,我看三天三夜也看不完!用split把字符串切割处理的方式把代码改成了如下:

(在此过程我深刻体会到split只是正则表达式里一个小小的方法,学好正则表达式才是王道啊,复杂一点的字符串用Regex处理起来真是太优美了!)

public class Test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = 100;
        while(n>0){
            String str = in.nextLine();
            System.out.println(arrStr(str));
            n--;
        }
    }
    public static String arrStr(String str){
        String[] fStr = str.split("%");
        String[] lStr = fStr[1].split("\\*");//*这个符号不能直接写,需要转义

        String fStrRegex = "(?<front>[a-z]*)(?<number>[1-9][0-9]*)";
        Pattern pattern = Pattern.compile(fStrRegex);
        Matcher matcher = pattern.matcher(fStr[0]);
        String repeatStr = lStr[0];
        String endStr = lStr[1];
        StringBuffer re = new StringBuffer();

        while (matcher.find()){
            String front = matcher.group("front");
            String number = matcher.group("number");
            int n = Integer.parseInt(number); //将字符串型转为数值型
            String frontStr = front;
            re.append(frontStr);

            for(int i=0;i<n;i++){
                re.append(repeatStr);
            }
        }
        
        re.append("%");
        re.append(repeatStr);
        re.append("*");
        re.append(endStr);
        return re.toString();
    }
}

运行结果如下:

严谨点还要加上个bool判断非法输入不能match的处理吧,不过我这里看到的题目没有说非法输入输出什么。。。字母大小写什么的。。。就这样了吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值