学计算机的秃头少女们今晚愉快地闲聊了一晚上,要不是实验室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的处理吧,不过我这里看到的题目没有说非法输入输出什么。。。字母大小写什么的。。。就这样了吧