正则表达式java应用
正则表达式其实就是一个字符串识别的规则,首先设定好规则,然后程序根据这个规则识别比较
在Java里面使用正则表达式需要涉及到两个Pattern和Matcher。Pattern和Matcher之间的关系就好比Pattern是做模具的师傅,pattern将模具(正则表达)做好之后,指派一个小工(matcher)去匹配,matcher要做的就是原材料(即要被匹配的源字符串)和模具(即Pattern中的正则表达式)配对、比较
Java正则表达式应用
判断功能
- public boolean matches(String regex)
String s = "13839120000";
String regex = "1[38]\\d{9}";//定义手机好规则
boolean flag = s.matches(regex);//判断功能
System.out.println("flag:"+flag);
分割功能
- public String[] split(String regex)
String s = "18-24";
String regex = "-";
String[] strArr = s.split(regex);
替换功能
- public String replaceAll(String regex,String replacement)
String s = "12342jasfkgnas234";
//把字符串里面的数字替换成*
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
System.out.println(result);
单个符号
英文句点.符号 : 匹配除换行符以外的任意字符
表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
例子:\bhi\b.*\bLucy\b
- \b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处(只匹配一个位置)
- .是另一个元字符,匹配除了换行符以外的任意字符。
- *同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。
因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词
中括号[] : 只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。
表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
| 符号 : 相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。
表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。
表示匹配次数:
- * : 0次或者多次
- + : 1次或者多次
- ? : 0次或者1次
- {n} : 恰好n次
- {n,m} : 从n次到m次,m可以不填,表示不限次数
注意:在使用group方法时,如果不加匹配次数,则默认匹配字符个数是单个字符
String regex = "[^abc]"; //没有添加次数,默认匹配单个字符
String regex1 = "[^abc]{1,}"; //添加了次数{1,},至少一次
Pattern pattern1 = Pattern.compile(regex);
Matcher matcher = pattern1.matcher("TESTaaaTEST2");
while (matcher.find()) {
System.out.println(matcher.group());
}
^符号:表示限定开头或否,如果用在方括号内[ ],^表示不想匹配的字符。
- 限定开头:要想匹配行首的字符要使用抑扬字符()——有时也被叫做插入符。例如,想找到text.txt中行首"he"打头的行,你可能会先用简单表达式he,但是这会匹配第三行的the,所以要使用正则表达式he,它只匹配在行首出现的he。
//限定开头
/[(^\s+)(\s+$)]/g //在[]中使用,不包括嵌套使用
(^cat)$
(^cat$)
^(cat)$
^(cat$)
- (否)取反:有时候指定“除了×××都匹配”会比较容易达到目的,当抑扬字符(^)出现方括号中时,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情形(也就是the和she),可以使用:[^st]he。
//表示否
[^a]表示“匹配除了a的任意字符”。
[^a-zA-Z0-9]表示“找到一个非字母也非数字的字符”。
[\^abc]表示“找到一个插入符或者a或者b或者c”。
只要是 ^ 这个字符是在中括号[]中被使用的话就是表示字符类的否定,如果不是的话就是表示限定开头。我这里说的是直接在[]中使用,不包括嵌套使用。
\S符号:非空字符
\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
\t符号: 匹配制表符
\n符号: 匹配一个换行符
\r符号:匹配一个回车符,与\n、\tab相同
\f符号:匹配一个换页符
\b符号:匹配一个单词的边界,也就是指单词和空格间的位置
正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。
快捷符号
\d : 表示[0-9]
\D : 表示[^0-9]
\w : 表示[0-9A-Za-z_],匹配下划线的任何单词字符
\W : 表示[^0-9A-Za-z_],匹配任何非单词字符
\s : 表示[\t\n\r\f]
\S : 表示[^\t\n\r\f]
示例
\ba\w*\b // 匹配以字母a开头的单词
\d+ // 匹配1个或更多连续的数字
\bw{6}\b // 匹配刚好6个字符的单词
String regex8 = "^[0][0-9]{2,3}-[0-9]{5,10}$";// 校验带区号座机电话
String regex7 = "^[1][3,4,5,7,8][0-9]{9}$";
String regExp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$";//校验手机号码
// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
//假设18位身份证号码:41000119910101123X 410001 19910101 123X
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//(18|19|20) 19(现阶段可能取值范围18xx-20xx年)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
//[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
//$结尾
//假设15位身份证号码:410001910101123 410001 910101 123
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十五位奇数代表男,偶数代表女),15位身份证不含X
//$结尾
参考
转载:https://blog.csdn.net/baidu_35181420/article/details/105692066