你不会的是这个正则表达式吗?
(严重怀疑取这种博客标题会没人看)
由于最近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”
n 比如数字串00010020,有三个前导0
n 比如数字串01,有1个前导0
n 比如数字串102030,没有前导0
n 比如数字串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