正则表达式

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"));
        
    }
    
}

 

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

 

 

 

 

 

 

 

 

 

 

 

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式