JAVA正则表达式
以前对正则表达式进行过应用,但也都是随查随用,但适合别人的不一定适合自己。今天有时间对正则表达式在JAVA中的应用进行下系统的整理。
tips:正则表达式的学习建议在进行过简单了解后,结合实例进行学习,多看,多用才可以掌握。
What?正则表达式是什么?
正则表达式是一串表达文本规则的字符串(代码)。可以用来对文本进行搜索、编辑或处理。并且正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
在JAVA中正则表达式最常用的方式是规则匹配和文本筛选。
例:
规则匹配:判断字符串是否为Url格式
文本筛选: 从"abcd123" 中捕获数字。
How?怎么用?
正则表达式语法
网上这样的文章铺天盖地,这里就不再赘述,个人推荐感觉比较全面的网站 www.runoob.com/java/java-regular-expressions.html
着重记录语法
字符 | 说明 |
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。 |
* | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
+ | 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。 |
? | 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。 |
(pattern) | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"\("或者"\)"。 |
{n,m} | m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。 |
[abc] | 字符集。匹配包含的任一字符。 |
[^xyz] | 反向字符集。匹配未包含的任何字符。 |
[a-z] | 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
\d | 数字字符匹配。等效于 [0-9]。 |
\D | 非数字字符匹配。等效于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
举例练习
1、数字
answer:^[0-9]+$
2、基本汉字
answer:^[\u4E00-\u9FA5]+$
3、英文字符
answer:^[a-zA-Z]+$
4、QQ号:全数字,限制5-13数,不能以0开头
answer: [1-9]\d{4,12}
5、身份证号
answer:^(\\d{15})|(\\d{18})$
6、E-mail校验
answer:^[a-zA-Z0-9]+\\w*@[a-zA-Z0-9]+(\\.[a-z]{2,3})+
7、URL
answer:(^((http|HTTP|https|HTTPS|ftp|FTP)://))?((([0-9]{1,3}\.){3}[0-9]{1,3})|((([0-9a-z_!~*\'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((\/\?)|(\/[0-9a-zA-Z_!~\*\'\(\)\.;\?:@&=\+\$,%#-\/]*)?)))$
JAVA中应用
/** * 数字校验:不限制数字位数 */ @Test public void test1(){ String regex = "^[0-9]+$"; String content = "00"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); } /** * 基本汉字匹配,不包含生僻字 * 编码范围 4E00-9FA5 */ @Test public void test2(){ String regex = "^[\u4E00-\u9FA5]+$"; String content = "测试1111测试"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); } /** * 英文字符 */ @Test public void test3(){ String regex = "^[a-zA-Z]+$"; String content = "aAbxs"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); } /** * 身份证号校验 15位/18位 */ @Test public void test4(){ String regex = "^(\\d{15})|(\\d{18})$"; String content = "411411198812046616"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); } /** * E-mail 校验 * 规则:1、不可以有特殊字符,不包括下划线 * 2、含有@ * 3、含有. */ @Test public void test5(){ String regex = "^[a-zA-Z0-9]+\\w*@[a-zA-Z0-9]+(\\.[a-z]{2,3})+"; String content = "989863767@qq.com"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); } /** * URL 校验 * 规则: 网路转载 */ @Test public void test6(){ String regex = "(^((http|HTTP|https|HTTPS|ftp|FTP)://))?"+ //协议校验 "((([0-9]{1,3}\\.){3}[0-9]{1,3})"+ //IP校验 "|"+ //domain校验 "((([0-9a-z_!~*\\'()-]+\\.)*"+ //三级域名 "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\."+ //二级域名 "[a-z]{2,6})"+ //顶级域名 "(:[0-9]{1,4})?"+ //端口 "((\\/\\?)|"+ //文件校验 "(\\/[0-9a-zA-Z_!~\\*\\'\\(\\)\\.;\\?:@&=\\+\\$,%#-\\/]*)?)))$"; String content = "https://www.oschina.net/code/snippet_2276973_44166"; boolean matches = Pattern.matches(regex, content); System.out.println(matches); }