你不会的是这个正则表达式吗?

(严重怀疑取这种博客标题会没人看)

由于最近java上机用到了一点正则表达式,所以想给正则表达式做个尽量全面的整理(不存在的,就是用什么整理什么2333)

1、首先是最常用到的特别字符‘*’‘+’‘?’

  • meat+,可以匹配 meat、meattttt 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。

  • meat*,可以匹配 mea、meat、meattttt 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。

  • meat?,可以匹配 mea或者 meat,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。

具体看这张图:

(来源:http://www.runoob.com/regexp/regexp-syntax.html

但是有时候限定符也是我要判断的啊,这个时候应该怎么办呢?转义!

2、正则表达式在java中的用法

以第三次上机的这道题为例:判断一行输入是否是一个没有前导0的无符号整数

对于“没有前导0的无符号整数”的定义:

- 是一个字符串s

- s的长度至少是1,没有上限要求

- s的字符集Σ={0, 1, 2, 3, 4, 5, 6, 7, 8, 9},其他所有字符都不应该出现在s

s的长度大于1时,若从其首部开始有若干个连续字符0,那么这些字符0都叫做s的“前导0

比如数字串00010020,有三个前导0

比如数字串01,有1个前导0

比如数字串102030,没有前导0

比如数字串0,没有前导0

 

根据题目要求,我们写出这个正则表达式:

其中 ^ 表示以紧接其后的字符开头(其实在这题不写也可以),以[1-9]中的某一个数字开头,接[0-9]中的0个或多个数字

不过这个表达式会把数字0判断为非法,当然0特判就行,不过我第一次用正则表达式,有点小激动,所以又写了一个正则表达式特判0(杀鸡用牛刀)

private static String pattern1 = new String("^[1-9][0-9]*");
    private static String pattern2 = new String("0");
    public static boolean isReasonable(String s) {
        if(Pattern.matches(pattern1, s) || Pattern.matches(pattern2, s)) {
            return true;
            }
            return false;
       }

用Pattern类的matches方法匹配判断就行啦

3、复杂一小点的正则表达式举例

ISBN-10的判断

ISBN-13的判断

ISBN的规则是:

 当然正则表达式只能做初步的模糊判断,具体的话可以这样做(以ISBN-10为例):

    public static boolean checkIsbn_10(String s) {        
        String s1 = new String("[0-9]{1,5}-[0-9]+-[0-9]+-([0-9]|X)");
        int []c = toInt(s); 
        if(Pattern.matches(s1, s)) { 
            s = s.replace("-", "");//去掉横杠
            if(s.length() == 10) {
                int sum = 0;
                for(int i = 0; i < 10; i++) {
                    sum += (10-i) * c[i];
                }
                if(sum % 11 == 0)
                    return true;
            }    
        }
        return false;
    }

 ps:其实我只是用到了正则表达式最浅显的部分QAQ,这篇博客以后再慢慢更新吧

其实百度上有太多博客写得比我好。。。。这么烂的博客主要是写给自己看的,更像是做笔记吧hhhhh

原文地址:https://www.cnblogs.com/PineZhuo/p/10553000.html