正则表达式
Posted tangdiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
在回顾正则表达式之前,我们先来回顾一下前边讲的 String ,先看几个简单的练习题吧!!
练习:
1. 输入字符串,然后再输入 2 个数字(一个表示起始位置,一个表示结束位置),按照指定的数字截取一个字符串
package cn.tedu.string; import java.util.Scanner; public class StringExer { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); int i = s.nextInt(); int j = s.nextInt(); System.out.println(subString(str, i, j)); /*char[] cs = str.toCharArray(); String nstr = new String(cs, i, j-i+1); System.out.println(nstr);*/ } //也可以定义一个方法进行封装 public static String subString(String str, int begin, int end){ //判断参数是否为空 if(str == null) return null; //判断下标 if(begin < 0 || begin >= str.length() || begin > end) return null; //判断结束下标 if(end < 0 || end >= str.length()) return null; char[] cs = str.toCharArray(); String sub = new String(cs, begin, begin - end); return sub; } }
2. 输入一个字符串,统计字符串中字母、数字和其他字符的个数
package cn.tedu.string; import java.util.Scanner; /** * 输入一个字符串,统计字符串中字母、数字和其他字符的个数 * @author 唐雕 * */ public class StringExer2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next();//以空白字符(空格、制表、回车)作为结束 //nextLine();//以回车作为结束 System.out.println("字母,数字,其他字符分别为:" + getCount(str)); } //统计字符串中字母、数字、其他字符的个数 public static String getCount(String str){ int zm = 0,sz = 0,qt = 0; if(str == null) return null; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if(c >= ‘a‘ && c <= ‘z‘ || c >= ‘A‘ && c <= ‘Z‘){ zm++; }else if(c >= ‘0‘ && c <= ‘9‘){ sz++; }else{ qt++; } } return "" + zm+ "," + sz + "," + qt; } }
3. 输入一个字符串,将其中的数字提取出来并求和
dsho353sdhiha89dnso4 -> 3+5+3+8+9+4 = 32
package cn.tedu.string; import java.util.Scanner; /** * 3. 输入一个字符串,将其中的数字提取出来并求和 dsho353sdhiha89dnso4 -> 3+5+3+8+9+4 = 32 * @author 唐雕 * */ public class StringExer3 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); System.out.println(getTotal(str)); } //将字符串中的数字提取出来并计算结果的方法 public static int getTotal(String str){ int num = 0; if(str == null) return num; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if(c >= ‘0‘ && c <=‘9‘){ num += (c - ‘0‘); } } return num; } }
4. 输入一个字符串,将其中的数字提取出来并进行升序排序
package cn.tedu.string; import java.util.Arrays; import java.util.Scanner; /** * 4. 输入一个字符串,将其中的数字提取出来并进行升序排序 * @author 唐雕 * */ public class StringExer4 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); System.out.println(getSort(str)); } //写一个方法将数字提出来并进行升序排序 public static String getSort(String str){ String pstr = ""; if(str == null) return null; //进行提取 for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if(c >= ‘0‘ && c <=‘9‘) pstr += c; } //进行排序、 char[] c = pstr.toCharArray(); /*int[] num = new int[c.length]; for (int i = 0; i < c.length; i++) { num[i] = (int)c[i]; }*/ //Arrays.copyOf(arr, count);//就可以将长度变小 Arrays.sort(c); /*for (int i = 0; i < num.length; i++) { c[i] = (char)num[i]; }*/ return new String(c); //进行排序、冒泡排序 /*for (int i = 1; i < pstr.length(); i++) { for(int j = 1; j < pstr.length()-i; j++){ int first = (int)pstr.charAt(j-1); int second = (int)pstr.charAt(j); if(first > second){ char temp = pstr.charAt(j-1); pstr.charAt(j-1) = pstr.charAt(j); pstr.charAt(j) = temp; } } }*/ } }
5. 输入一个字符串,统计其中每一个字符出现的次数
package cn.tedu.string; import java.util.Scanner; /** * 5. 输入一个字符串,统计其中每一个字符出现的次数 * 要想不重复统计,给每一位做一个标记,做一个 boolean 数组,为false和true * @author 唐雕 * */ public class StringExer5 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); getCount(str); } //写一个统计每一个字符出现次数的函数 public static void getCount(String str){ /*char[] cs = new char[str.length()]; int k = 0; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); int count = 1; for(int j = i + 1; j < str.length(); j++) if(c == str.charAt(j)){ count++; } cs[k] = c; k++; System.out.print(c + ":" + count+" "); }*/ boolean[] bs = new boolean[str.length()]; for (int i = 0; i < bs.length; i++) { //判断这一位是否已经被统计过 if(bs[i]) continue; char c = str.charAt(i); int count = 0; for (int j = i; j < bs.length; j++) { if(c == str.charAt(j)){ count++; bs[j] = true; } } System.out.print(str.charAt(i) + ":" + count + " "); } } }
注意:在 String 中提供了一系列操作而不改变原数组的方法
instanceof ---- 判断对象和类的关系的
只要前边的对象是后边的类/子类/接口/子接口的实例,就返回 true
练习:输入一个字符串和一个数字,数字表示字节个数,根据指定的字节个数切割字符串(GBK)
package cn.tedu.string; import java.io.UnsupportedEncodingException; import java.util.Scanner; /** * 练习:输入一个字符串和一个数字,数字表示字节个数,根据指定的字节个数切割字符串(GBK) * @author 唐雕 * */ public class StringExer1 { public static void main(String[] args) throws Exception { Scanner s = new Scanner(System.in); String str = s.next(); int n = s.nextInt(); //将字符串转化为一个字节数组 byte[] bs = str.getBytes("gbk"); //写完 bug调 bug,工作上跟学习上不一样,产品经理和程序员打起来了,学思路 //循环跷起来,代码敲上几遍就熟练了,思路方面需要学习。把思路一步步的写上,需要用到哪些方法,后面在敲的时候,思路才能越来越快 //给一个练习,当场可以不敲出来,大概的想法后怎么做,拆解练习,思路,再说实现的 String sub = new String(bs,0,n,"gbk"); if(sub.charAt(sub.length()-1) != str.charAt(sub.length()-1))//比较两个字符用 == 就行 sub = new String(bs,0,n-1); System.out.println(sub); } }
练习 : 输入两个字符串,打印第二个字符串在第一个字符串出现的所有位置
package cn.tedu.string; import java.util.Scanner; /** * 练习 : 输入两个字符串,打印第二个字符串在第一个字符串出现的所有位置 * @author 唐雕 * */ public class StringExer2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str1 = s.next(); String str2 = s.next(); /*for (int i = 0; i < str1.length(); i++) { int count = 1; if(str1.charAt(i) == str2.charAt(0)){ for (int j = 1; j < str2.length(); j++) { if(str1.charAt(i + j) != str2.charAt(j)) break; count++; } } if(count == str2.length()) System.out.print(i+" "); }*/ //用到 indexOf //记录位置,这里用一个index 就可以遍历整个字符串了,indexOf()不仅可以判断字符,还可以直接判断字符串 int index = 0; //找子串出现的位置,从第0开始向后依次找 while(index < str1.length()){ //从指定的位置开始找元素 index = str1.indexOf(str2, index); if(index != -1){ System.out.println(index); index++; }else break; } } }
好的,接下来,就进入今天的主题:
regular expression ---正则表达式 --- REGEX
适用于完成筛选和过滤的操作(就像是之前的 endWith(),startWith(),contains(),但是这几个不能过滤范围方面的)
|
|
Pattren --- 适用于完成筛选和过滤的操作
练习:
1.输入一个字符串,然后判断字符串是否是一个小数字符串
10.28 0.56 3.00 15. 00.65
package cn.tedu.regex; import java.util.Scanner; public class PatternExer1 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); //System.out.println(str.matches("[0-9]+\.[0-9]+")); //使用满足两个条件的,就匹配两个中间用 || 分开就是了 System.out.println(str.matches("0\.\d") || str.matches("[1-9]\d*\.\d+")); } }
2.校验密码:8-20位,小写字母/大写字母/数字中的至少两种
package cn.tedu.regex; import java.util.Scanner; public class PatternExer2 { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.next(); //System.out.println(str.matches("[([a-z][A-Z]\d]{2,}?){8,20}")); System.out.println(check(str)); } //写这个方法 private static boolean check(String pwd){ if(!pwd.matches("[a-zA-Z0-9]{8,20}")) return false; //判断是否含有小写字母 int count = 0; //判断是否含有小写字母 if(pwd.matches(".*[a-z].*")) count++; //判断是否含有大写字母 if(pwd.matches(".*[A-Z].*")) count++; //判断是否含有数字 if(pwd.matches(".*[0-9].*")) count++; return count >= 2; } }
在正则表达式的上面,我们还有一些基础知识,我也是在 Eclipse 中检验了的,如下:
package cn.tedu.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternDemo1 { public static void main(String[] args) { String str = "abc"; //判断字符串是否是 abc //编译正则形式 /*Pattern p = Pattern.compile("abc"); //将正则进行匹配 Matcher m = p.matcher(str); //进行判断 boolean b = m.matches(); System.out.println(b);*/ //判断按字符串:由3个字母组成,第一个字母是a/b/c //第二个字母是 d/e/f/g //第三个字母是 x/y/z Pattern p = Pattern.compile("[bac][gedf][xyz]"); Matcher m = p.matcher(str); boolean b = m.matches(); System.out.println(b); } }
package cn.tedu.regex; public class PatternDemo2 { public static void main(String[] args) { //判断按字符串:由3个字母组成,第一个字母是a/b/c //第二个字母是 d/e/f/g //第三个字母是 x/y/z String str = "adx"; System.out.println(str.matches("[abc][defg][xyz]")); //匹配由一个字母组成的字符串 System.out.println(str.matches("[a-zA-Z]")); //匹配由一个数字组成的字符串 System.out.println(str.matches("[0-9]")); System.out.println(str.matches("\d"));//表示一个数字 \D 表示非数字 //匹配由一个字符组成的字符串,但不是a/b/c //[^…]表示除了这些字符 System.out.println(str.matches("[^abc]")); } }
package cn.tedu.regex; public class PatternDemo3 { public static void main(String[] args) { String str = "\"; //匹配由 a 开头的由 2 个字符组成的字符串 //.表示通配符,可以匹配任意一个类型的字符 System.out.println(str.matches("a.")); //判断是否是一个 . // \. Java 先转义为 .,正则转义为 . System.out.println(str.matches("\.")); //怎么匹配 (比如我们复制的路径中就有反斜杠) // \\ Java 先转义为 \,正则再转义为 System.out.println(str.matches("\\")); } }
package cn.tedu.regex; public class PatternDemo4 { public static void main(String[] args) { String str = ""; //匹配由 a 开头至少由 2 个质子府组成的字符串 //+ 表示之前的字符至少出现 1 次 >= 1 System.out.println(str.matches("a.+")); //匹配由小写字母开头由数字结尾的字符串 //*表示之前的字符可有可无 >= 0 System.out.println(str.matches("[a-z].*\d")); //匹配由a开头至多 2 个字符组成的字符串 // ? 表示之前的字符至多出现 1 次 <= 1 System.out.println(str.matches("a.?")); } }
package cn.tedu.regex; public class PatternDemo5 { public static void main(String[] args) { String str = "fufjj"; //匹配由5个字母组成的字符串 //{n}表示之前的字符恰好出现 n 次 == n System.out.println(str.matches("[a-z]{5}")); //匹配至少由5个小写字母组成的字符串 System.out.println(str.matches("[a-z]{5,}")); //匹配由 8-12 个小写字母组成的字符串 System.out.println("[a-z]{8,12}"); } }
package cn.tedu.regex; public class PatternDemo6 { public static void main(String[] args) { String str = "fabtab"; //判断含有至少含有 2 个ab的字符串 //()捕获组 //正则表达式会对其中的捕获组进行自动的编号 //编号是从1开始 System.out.println(str.matches(".*(ab).*(ab).*")); // \n 表示引用前边编号为n 的捕获组 System.out.println(str.matches(".*(ab).*\1.*")); //捕获组的编号是从捕获组的左半边括号出现的位置开始计算的 //(A((BC)(D))E)(F) // \1 A((BC)(D))E // \2 (BC)(D) //判断一个字符串是否是一个叠字字符串 System.out.println(str.matches("(.)\1+")); System.out.println(str.matches("(.){2,}"));//表示匹配的不一定是叠字,只要有两个及以上就行了 //匹配AABB形式的词语 //欢欢喜喜 String str1 = "上上下下"; System.out.println(str1.matches("(.)\1(.)\2")); //匹配ABAB形式的词语 String str2 = "休息休息"; System.out.println(str2.matches("(.)(.)\1\2")); } }
不想再写了,明天继续!!!
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性