Java正则表达式基础知识学习
2022-01-21点击量:436
一、概述1.正则表达式是一个字符序列,用来描述文本的模式结构的表达式,亦可看做一门“微型语言”。因此,尤其适用于文本处理。2.一个文本模式可能有多种正则表达式写法,有的简单清晰,有的快速但复杂,有的功能全面,有的兼容性好,要多多尝试加以权衡。3.正则表达式是“文本内匹配”。4.正则表达式的准确性:匹配期望的文本,同时不匹配不期望的文本。比如,匹配三位数,可使用\d{3},但这样会匹配001这样的数,准确的写法应是:[1-9]\d{2}5.匹配分析的思路最好采用“逐字符方式”。比如note匹配一个n紧接着一个o紧接着一个t紧接着一个e,而不是匹配单词"note"。二、基本元素1.普通字符:除*,?,\,(,),[,],-,.,+,^,$,{,},以外的字符匹配它自身,比如a匹配a2.点号.:匹配任意不包括换行符的单个字符。比如,sa.可匹配sat,sa*,sa[等。3.字符组[characters]:匹配字符组中指定字符集合中的任意单个字符:比如[abc]将匹配a或b或c,ca[ptb]将匹配cap,cat或cab。4.排除性字符组[^characters]:匹配字符组中指定字符集合之外的任意单个字符:比如,[^abc]将匹配除了a,b,c之外的任意单个字符。ca[^ptb],将匹配caX的文本,除了cap,cat,cab,注意,这里是匹配一个非指定的字符,而不是不匹配。5.范围字符组:[char1-char2]将匹配从char1到char2之间的任意单个字符(按照ASCII编码)。比如,[a-z]匹配任意小写字符;[A-Z]匹配任意大写字符;[0-9]匹配任意数字;[a-zA-Z0-9]匹配任意大小写字符或数字。6.特殊字符:凡是在正则式中具有特殊含义的字符,要匹配字符本身(将其作为普通文本)都必须使用反斜线\进行转义;通常需要转义的字符有:.+*?{}[]()-\^$。比如,匹配.的正则式是\.,匹配\的正则式是\\,匹配(的正则式是\(;要匹配(ab)的正则表达式是\(ab\);要匹配a?的表达式是a\?;a?将匹配空或单个a。7.匹配空白字符:\f换页\n换行\r回车\t制表符\v垂直制表符\s匹配任意空白符,包括上述任意一种8.字符类:等价于\d[0-9]任意单个数字\D[^0-9]任意单个的非数字字符\w[a-zA-Z0-9_]\W[^a-zA-Z0-9_]\s[\f\n\r\t\v]\S[^\f\n\r\t\v]9.POSIX字符类:例如:[:digit:][0-9];[:alpha:][a-zA-Z];[:alnum:][a-zA-Z0-9]具体应用时要再加一层括号,比如TEST[[:digit:]]匹配TEST0-TEST9。三、匹配元素组合:下面X,Y都可以是一个子表达式1.顺序结构XY:匹配X后紧跟Y的文本,比如[0-9][a-z]匹配数字后跟小写字母的文本,7z,0x等,但不匹配ap,77。2.多选分支结构X|Y:匹配X或者Y,比如[0-9]|[a-z]匹配数字或小写字母,相当于[0-9a-z]。X|Y是一种多选分支结构,在构造复杂正则表达式中有重要作用。3.匹配量词:匹配一个或多个X:X+;例如s/d+匹配s后跟至少一个数字,s9,s34,s235,...匹配零个或多个X:X*;例如s/d*匹配s后跟空或者至少一个数字,s,s9,s34,s235,...匹配零个或一个X:X?;例如https?匹配http或https匹配恰好m个X:X{m};例如s/d{4}匹配s0000,s1234,但不匹配s234,s23445匹配至少m个X:X{m,};例如s/d{2,}匹配s12,s123,但不匹配s1匹配至少m个但不超过n个X:X{m,n};例如s/d{2,4},匹配s12,s123,s1234,但不匹配s1,s123454.子表达式(X):将X作为一个子表达式,紧邻的匹配量词将作用于X整体,而不是X中的单个字符。例如(s\d){3}匹配s1s1s1,而不匹配s1115.贪婪匹配:默认匹配模式是“贪婪型匹配”,即匹配尽可能多的文本。例如,Youmakemelost.正则式.*中的.*将从Y前面的空格一直匹配到末尾的换行符之前,而不会在第一个停下来。6.位置匹配:[1]\b单词边界\B非单词边界。文本:Thecaptainworehiscapandcapeproudlyashesatlisteningtotherecapofhowhiscrewsavedthemenfromacapsizedvessel.正则式:cap;\bcap;cap\b;\bcap\b;\Bcap;cap\B;\Bcap\B[2]^匹配文本起始$匹配文本末尾例如^[a-z]123将匹配以小写字母开头后跟123的文本。匹配文本a123而不是slha123。[a-z]123$将匹配以小写字母后跟123结尾的文本。匹配文本sssd123而不是sdf123dss。7.捕获功能:使用括号将一个子表达式匹配的文本进行捕获,后面可在模式或处理中对捕获的文本进行引用或处理。((regex1)-(regex2))-(regex3)\n引用被捕获的第n个文本;n按左括号出现的顺序进行标识\0表示匹配的整个文本\1ref=((regex1)-(regex2));\2ref=(regex1);\3ref=(regex2);\4ref=(regex3)在替换文本时可以使用$1,$2,$3,$4分别引用\1,\2,\3,\4捕获的文本。比如,(\d{3})mygod(\1)必须匹配三位数字mygod三位数字的模式,并且,后面三位数字必须与前面三位数字完全相同。8.回溯引用:相同匹配的概念,匹配在多处出现的相同文本。比如要匹配hello中的...,使用正则式.*?,这里,\1可以捕获([hH][1-6])所得到的结果,从而起到对应的效果,以免匹配到23的不合法文本。文本:HELLOWORLDWAOYEAH正则式:.*?.*?9.前后查找:更灵活的位置匹配(?=right-regex):表示右边字符序列匹配right-regex的位置;(?...