深入理解Java正则表达式 深碍√TFBOYSˉ_ 2021-11-10 23:08 233阅读 0赞 概述 # Java 正则表达式 # 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 深入理解Java正则表达式:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。 eg: 表达式”t。o 可以匹配:tno,t\#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。 方括号:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。 eg: 表达式:t\[abcd\]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。 | 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。 eg: 表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn 表示匹配次数的符号 屏幕快照 2016-10-26 10.42.53.png \{n, \}表示至少N次。 eg: 表达式:\[0—9\]\{ 3 \} \\— \[0-9\]\{ 2 \} \\— \[0-9\]\{ 3 \} 的匹配格式为:999—99—999 因为“—”符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符“\\”。 ^符号:表示否 ^符号被称为“否”符号,如果用在方括号内,“^“表示不想匹配的字符。 eg: 表达式:\[^x\] 第一个字符不能是x 圆括号,和空白符号 “\\s”是空白符号,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。 ()是分组号,可以用ORO API提取处出值,后面将详细讨论 正则表达式的一些快捷符号: \\d表示\[0—9\], \\D表示\[^0—9\], \\w表示\[0—9A—Z\_a—z\], \\W表示\[^0—9A—Z\_a—z\], \\s表示\[\\t\\n\\r\\f\], \\S表示\[^\\t\\n\\r\\f\] 一些常用的正则表达式: Java:((\[a-z\]|\_)(\\w\*))\{6,20\}匹配以字母或下划线开头,字母数字下划线结尾的字符串 JavaScript:/^(-?)(\\d+)$/匹配数字。/^\\w+$/匹配字母数字下划线。 .+ 一个或多个字符 /0 第一次匹配的字符串 java类中使用正则表达式: eg1: Pattern p = Pattern.compile("t.n"); Matcher m = p.matcher(“ton”); if(m.matches())\{ return true; \} eg2:boolean bool=Pattern.matches (“t.n”,”ton”); 如果一个正则表达式要重复利用,用第一种,如果只匹配一次,第二种是最佳选择。 反斜线字符(‘\\’)用于转义字符,同时还可以引用非转义字符(不包括非转义字母) 因此‘\\’表示‘\\’,‘\{’表示\{。 但是‘\\y’就是错的,因为在不表示转义构造的 任何字母字符前 使用反斜线都是错误的。 根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "(hello)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。 注意:‘\\b’是一个字符而‘\\b’是两个字符 Pattern类 8种模式:比如启用多行模式,启用unix模式等,eg int CASE\_INSENSITIVE表示启用不区分大小写的 4个静态方法 两个单例模式构造器: Pattern compile(String regex); Pattern compile(String regex,int flags)flags为八种模式的一种 eg2: Pattern p=Pattern.compile("\[a-z\]\\s\[a-z\]"); Matcher m=p.matcher("b c"); if(m.matches()) Sysout(1111); else Sysout(2222); 输出结果为1111; 一个匹配方法,一个返回String的字面值模式方法: boolean matches(String regex,CharSequence input);//input与regex匹 配返回true。 String quote(String s);//返回指定String的字面值。 eg3:boolean bool=Pattern.matches("\[a-z\] \[a-z\]",”b c”); //结果为true Sysout(Pattern.quote(“a\_\#/tb”)); //输出结果为 “\\Qa\_\# b”\\E 6个普通方法 返回此模式的匹配器: Matcher matcher(CharSequence input); 返回此模式的标志: int flags(); 返回此模式的regex: String pattern(); 两个字符串切割方法: String\[\] split(CharSequence input); String\[\] split(CharSequence input,int limit); limit为返回字符串的个数,如果等于0,返回所有 拆分的字符串,如果大于拆分字符串的实际个数, 返回实际个数。 toString方法: String toString(); eg4: Pattern p=Pattern.compile("\[,;\\s\]"); String str="wo,ai;ni haha"; String\[\] strs=p.split(str); for(String s : strs)\{ Sysout(s);//输出 “wo” “ai” “ni” “haha” \} strs=p.split(str,2) for(String s : strs)\{ Sysout(s);//输出 “wo” “ai;ni haha” \} Strs=p.split(str,0) for(String s : strs)\{ Sysout(s);//输出 “wo” “ai” “ni” “haha” \} 常用的正则表达式 "^\\d+$" //非负整数(正整数 + 0) "^\[0-9\]\[1-9\]\[0-9\]$" //正整数 "^((-\\d+)|(0+))$" //非正整数(负整数 + 0) "^-\[0-9\]\[1-9\]\[0-9\]$" //负整数 "^-?\\d+$" //整数 "^\\d+(.\\d+)?$" //非负浮点数(正浮点数 + 0) "^((\[0-9\]+.\[0-9\]\[1-9\]\[0-9\])|(\[0-9\]\[1-9\]\[0-9\].\[0-9\]+)|(\[0-9\]\[1-9\]\[0-9\]))$" //正浮点数 "^((-\\d+(.\\d+)?)|(0+(.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-((\[0-9\]+.\[0-9\]\[1-9\]\[0-9\])|(\[0-9\]\[1-9\]\[0-9\].\[0-9\]+)|(\[0-9\]\[1-9\]\[0-9\])))$" //负浮点数 "^(-?\\d+)(.\\d+)?$" //浮点数 "^\[A-Za-z\]+$" //由26个英文字母组成的字符串 "^\[A-Z\]+$" //由26个英文字母的大写组成的字符串 "^\[a-z\]+$" //由26个英文字母的小写组成的字符串 "^\[A-Za-z0-9\]+$" //由数字和26个英文字母组成的字符串 "^\\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^\[\\w-\]+(.\[\\w-\]+)\*@\[\\w-\]+(.\[\\w-\]+)+$" //email地址 "^\[a-zA-z\]+://(\\w+(-\\w+))(.(\\w+(-\\w+)))(\\?\\S)?$" //url /^(d\{2\}|d\{4\})-((0(\[1-9\]\{1\}))|(1\[1|2\]))-((0-2)|(3\[0|1\]))$/ // 年-月-日 /^((0(\[1-9\]\{1\}))|(1\[1|2\]))/((0-2)|(3\[0|1\]))/(d\{2\}|d\{4\})$/ // 月/日/年 "^(\[w-.\]+)@((\[\[0-9\]\{1,3\}.\[0-9\]\{1,3\}.\[0-9\]\{1,3\}.)|((\[w-\]+.)+))(\[a-zA-Z\]\{2,4\}|\[0-9\]\{1,3\})(\]?)$" //Emil /^((+?\[0-9\]\{2,4\}-\[0-9\]\{3,4\}-)|(\[0-9\]\{3,4\}-))?(\[0-9\]\{7,8\})(-\[0-9\]+)?$/ //电话号码 "^(d\{1,2\}|1dd|2\[0-4\]d|25\[0-5\]).(d\{1,2\}|1dd|2\[0-4\]d|25\[0-5\]).(d\{1,2\}|1dd|2\[0-4\]d|25\[0-5\]).(d\{1,2\}|1dd|2\[0-4\]d|25\[0-5\])$" //IP地址 匹配中文字符的正则表达式: \[\\\\u4e00-\\\\u9fa5\] 匹配双字节字符(包括汉字在内):\[^\\\\x00-\\\\xff\] 匹配空行的正则表达式:\\n\[\\s| \]\*\\r 匹配HTML标记的正则表达式:/<(.)>.<\\/\\1>|<(.\*) \\/>/ 匹配首尾空格的正则表达式:(^\\s)|(\\s$) 匹配Email地址的正则表达式:\\w+(\[-+.\]\\w+)@\\w+(\[-.\]\\w+).\\w+(\[-.\]\\w+)\* 匹配网址URL的正则表达式:^\[a-zA-z\]+://(\\w+(-\\w+))(\\.(\\w+(-\\w+)))(\\?\\S)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^\[a-zA-Z\]\[a-zA-Z0-9\_\]\{4,15\}$ 匹配国内电话号码:(\\d\{3\}-|\\d\{4\}-)?(\\d\{8\}|\\d\{7\})? 匹配腾讯QQ号:^\[1-9\]\[1-9\]\[0-9\]$ \\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\\n’ 或 ’\\r’ 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\\n’ 或 ’\\r’ 之前的位置。 匹配前面的子表达式零次或多次。 匹配前面的子表达式一次或多次。+ 等价于 \{1,\}。 ? 匹配前面的子表达式零次或一次。? 等价于 \{0,1\}。 \{n\} n 是一个非负整数,匹配确定的n 次。 \{n,\} n 是一个非负整数,至少匹配n 次。 \{n,m\} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (\*, +, ?, \{n\}, \{n,\}, \{n,m\}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 . 匹配除 "\\n" 之外的任何单个字符。要匹配包括 ’\\n’ 在内的任何字符,请使用象 ’\[.\\n\]’ 的模式。 (pattern) 匹配pattern 并获取这一匹配。 (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 (?!pattern) 负向预查,与(?=pattern)作用相反 x|y 匹配 x 或 y。 \[xyz\] 字符集合。 \[^xyz\] 负值字符集合。 \[a-z\] 字符范围,匹配指定范围内的任意字符。 \[^a-z\] 负值字符范围,匹配任何不在指定范围内的任意字符。 \\b 匹配一个单词边界,也就是指单词和空格间的位置。 \\B 匹配非单词边界。 \\cx 匹配由x指明的控制字符。 \\d 匹配一个数字字符。等价于 \[0-9\]。 \\D 匹配一个非数字字符。等价于 \[^0-9\]。 \\f 匹配一个换页符。等价于 \\\\x0c 和 \\cL。 \\n 匹配一个换行符。等价于 \\\\x0a 和 \\cJ。 \\r 匹配一个回车符。等价于 \\\\x0d 和 \\cM。 \\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于\[ \\f\\n\\r\\t\\v\]。 \\S 匹配任何非空白字符。等价于 \[^ \\f\\n\\r\\t\\v\]。 \\t 匹配一个制表符。等价于 \\\\x09 和 \\cI。 \\v 匹配一个垂直制表符。等价于 \\\\x0b 和 \\cK。 \\w 匹配包括下划线的任何单词字符。等价于’\[A-Za-z0-9\_\]’。 \\W 匹配任何非单词字符。等价于 ’\[^A-Za-z0-9\_\]’。 \\\\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 \\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 \\n 标识一个八进制转义值或一个后向引用。如果 \\n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 \\nm 标识一个八进制转义值或一个后向引用。如果 \\nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \\nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \\nm 将匹配八进制转义值 nm。 \\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 \\\\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。 匹配中文字符的正则表达式: \[u4e00-u9fa5\] 匹配双字节字符(包括汉字在内):\[^\\\\x00-\\\\xff\] 匹配空行的正则表达式:n\[s| \]\*r 匹配HTML标记的正则表达式:/<(.)>.</1>|<(.\*) />/ 匹配首尾空格的正则表达式:(^s)|(s$) 匹配Email地址的正则表达式:w+(\[-+.\]w+)@w+(\[-.\]w+).w+(\[-.\]w+)\* 匹配网址URL的正则表达式:http://(\[w-\]+.)+\[w-\]+(/\[w- ./?%&=\]\*)? 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/\[^u4E00-u9FA5\]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/\[^u4E00-u9FA5\]/g,''))" 用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/\[^uFF00-uFFFF\]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/\[^uFF00-uFFFF\]/g,''))" 正则表达式限制只能输入数字:οnkeyup="value=value.replace(/\[^d\]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/\[^d\]/g,''))" 用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/\[W\]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/\[^d\]/g,''))" 整理: 匹配中文字符的正则表达式: \[\\\\u4e00-\\\\u9fa5\] 匹配双字节字符(包括汉字在内):\[^\\\\x00-\\\\xff\] 匹配空行的正则表达式:\\n\[\\s| \]\\r 匹配HTML标记的正则表达式:/<(.)>.<\\/\\1>|<(.) \\/>/ 匹配首尾空格的正则表达式:(^\\s)|(\\s$) 匹配IP地址的正则表达式:/(\\d+).(\\d+).(\\d+).(\\d+)/g // 匹配Email地址的正则表达式:\\w+(\[-+.\]\\w+)@\\w+(\[-.\]\\w+).\\w+(\[-.\]\\w+) 匹配网址URL的正则表达式:http://(/\[\\w-\]+\\.)+\[\\w-\]+(/\[\\w- ./?%&=\])? sql语句:^(select|drop|delete|create|update|insert).$ 1、非负整数:^\\d+$ 2、正整数:^\[0-9\]\[1-9\]\[0-9\]$ 3、非正整数:^((-\\d+)|(0+))$ 4、负整数:^-\[0-9\]\[1-9\]\[0-9\]\*$ 5、整数:^-?\\d+$ 6、非负浮点数:^\\d+(.\\d+)?$ 7、正浮点数:^((0-9)+.\[0-9\]\[1-9\]\[0-9\])|(\[0-9\]\[1-9\]\[0-9\].\[0-9\]+)|(\[0-9\]\[1-9\]\[0-9\]))$ 8、非正浮点数:^((-\\d+.\\d+)?)|(0+(.0+)?))$ 9、负浮点数:^(-((正浮点数正则式)))$ 10、英文字符串:^\[A-Za-z\]+$ 11、英文大写串:^\[A-Z\]+$ 12、英文小写串:^\[a-z\]+$ 13、英文字符数字串:^\[A-Za-z0-9\]+$ 14、英数字加下划线串:^\\w+$ 15、E-mail地址:^\[\\w-\]+(.\[\\w-\]+)\*@\[\\w-\]+(.\[\\w-\]+)+$ 16、URL:^\[a-zA-Z\]+://(\\w+(-\\w+))(.(\\w+(-\\w+)))(\\?\\s)?$ 或:^http:\\/\\/\[A-Za-z0-9\]+.\[A-Za-z0-9\]+\[\\/=\\?%-&\_~\`@\[\]\\':+!\](\{FNXX==XXFN\})$ 17、邮政编码:^\[1-9\]\\d\{5\}$ 18、中文:^\[\\\\u0391-\\\\uFFE5\]+$ 19、电话号码:^(((\\d\{2,3\}))|(\\d\{3\}-))?((0\\d\{2,3\})|0\\d\{2,3\}-)?\[1-9\]\\d\{6,7\}(-\\d\{1,4\})?$ 20、手机号码:^(((\\d\{2,3\}))|(\\d\{3\}-))?13\\d\{9\}$ 21、双字节字符(包括汉字在内):^\\\\x00-\\\\xff 22、匹配首尾空格:(^\\s)|(\\s$)(像vbscript那样的trim函数) 23、匹配HTML标记:<(.)>.<\\/\\1>|<(.\*) \\/> 24、匹配空行:\\n\[\\s| \]\*\\r 25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) = ('|")?(\\w|\\|\\/|.)+('|"| \*|>)? 26、提取信息中的邮件地址:\\w+(\[-+.\]\\w+)@\\w+(\[-.\]\\w+).\\w+(\[-.\]\\w+)\* 27、提取信息中的图片链接:(s|S)(r|R)(c|C) = ('|")?(\\w|\\|\\/|.)+('|"| \*|>)? 28、提取信息中的IP地址:(\\d+).(\\d+).(\\d+).(\\d+) 29、提取信息中的中国手机号码:(86)013\\d\{9\} 30、提取信息中的中国固定电话号码:((\\d\{3,4\})|\\d\{3,4\}-|\\s)?\\d\{8\} 31、提取信息中的中国电话号码(包括移动和固定电话):((\\d\{3,4\})|\\d\{3,4\}-|\\s)?\\d\{7,14\} 32、提取信息中的中国邮政编码:\[1-9\]\{1\}(\\d+)\{5\} 33、提取信息中的浮点数(即小数):(-?\\d\*).?\\d+ 34、提取信息中的任何数字 :(-?\\d\*)(.\\d+)? 35、IP:(\\d+).(\\d+).(\\d+).(\\d+) # 总结 # 到这里,深入理解Java正则表达式就结束了,,不足之处还望大家多多包涵!!觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持。(吹一波,233~~) 下面和大家交流几点编程的经验: 1、多写多敲代码,好的代码与扎实的基础知识一定是实践出来的 2丶 测试、测试再测试,如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。 3丶 简化编程,加快速度,代码风骚,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。 最后,每一位读到这里的朋友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步。 高级架构师交流群680075317 欢迎各位前来交流和分享
还没有评论,来说两句吧...