• 正则表达式


    在回顾正则表达式之前,我们先来回顾一下前边讲的 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"));
            
        }
        
    }

     不想再写了,明天继续!!!

  • 相关阅读:
    java lambda
    ssh配置基础
    信息安全课程笔记1
    字体标记与文字布局
    字符串:格式化
    字符串
    标签详细描述
    HTML中的标签列表
    html(1)
    python列表命令
  • 原文地址:https://www.cnblogs.com/tangdiao/p/9488548.html
Copyright © 2020-2023  润新知