正则表达式及小例子文档格式.docx
《正则表达式及小例子文档格式.docx》由会员分享,可在线阅读,更多相关《正则表达式及小例子文档格式.docx(30页珍藏版)》请在冰点文库上搜索。
![正则表达式及小例子文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/39d9bc62-a8a3-4ff5-b889-a45f21e5e8e8/39d9bc62-a8a3-4ff5-b889-a45f21e5e8e81.gif)
\d数字
\D非数字
\w单字字符(0-9,A-Z,a-z)
\W非单字字符
\s空白(空格符,换行符,回车符,制表符)
\S非空白
[]由方括号内的一个字符列表创建的自定义字符类匹配任何单个字符
下面的字符将用于控制将一个子模式应用到匹配次数的过程.
?
重复前面的子模式0次到一次
*重复前面的子模式0次或多次
+重复前面的子模式一次到多次
匹配中文字符的正则表达式:
[\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):
[^\x00-\xff]
应用:
计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){returnthis.replace([^\x00-\xff]/g,"
aa"
).length;
}
匹配空行的正则表达式:
\n[\s|]*\r
匹配HTML标记的正则表达式:
/<
(.*)>
.*<
\/\1>
|<
(.*)\/>
/
匹配首尾空格的正则表达式:
(^\s*)|(\s*$)
以下是实例部分:
实例一:
正则式是最简单的能准确匹配一个给定String的模式,模式与要匹配的文本是等价的.静态的Pattern.matches方法用于比较一个String是否匹配一个给定模式.例程如下:
Stringdata="
java"
;
booleanresult=Pattern.matches("
data);
输出:
true
实例二:
String[]dataArr={"
moon"
"
mon"
mono"
};
StringpatternStr="
m(o+)n"
booleanresult=false;
for(Stringstr:
dataArr){
result=Pattern.matches(patternStr,str);
if(result){
System.out.println("
字符串"
+str+"
匹配模式"
+patternStr+"
成功"
);
}
else{
失败"
}
字符串moon匹配模式m(o+)n成功
字符串mon匹配模式m(o+)n成功
字符串mono匹配模式m(o+)n失败
模式是”m(o+)n”,它表示mn中间的o可以重复一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一个o,和模式匹配不上.
注:
+表示一次或多次;
表示0次或一次;
*表示0次或多次.
实例三:
ban"
ben"
bin"
bon"
"
bun"
"
byn"
baen"
};
b[aeiou]n"
booleanresult=false;
result=Pattern.matches(patternStr,str);
else{
字符串ban匹配模式b[aeiou]n成功
字符串ben匹配模式b[aeiou]n成功
字符串bin匹配模式b[aeiou]n成功
字符串bon匹配模式b[aeiou]n成功
字符串bun匹配模式b[aeiou]n成功
字符串byn匹配模式b[aeiou]n失败
字符串baen匹配模式b[aeiou]n失败
方括号中只允许的单个字符,模式“b[aeiou]n”指定,只有以b开头,n结尾,中间是a,e,i,o,u中任意一个的才能匹配上,所以数组的前五个可以匹配,后两个元素无法匹配。
方括号[]表示只有其中指定的字符才能匹配.
实例四:
been"
bean"
boon"
buin"
bynn"
StringpatternStr="
b(ee|ea|oo)n"
booleanresult=Pattern.matches(patternStr,str);
字符串been匹配模式b(ee|ea|oo)n成功
字符串bean匹配模式b(ee|ea|oo)n成功
字符串boon匹配模式b(ee|ea|oo)n成功
字符串buin匹配模式b(ee|ea|oo)n失败
字符串bynn匹配模式b(ee|ea|oo)n失败
如果需要匹配多个字符,那么[]就不能用上了,这里我们可以用()加上|来代替,()表示一组,|表示或的关系,模式b(ee|ea|oo)n就能匹配been,bean,boon等,因此前三个能匹配上,而后两个不能.
实例五:
1"
10"
101"
1010"
100+"
100d"
\\d+"
booleanresult=Pattern.matches(patternStr,str);
}else{
字符串1匹配模式\d+成功
字符串10匹配模式\d+成功
字符串101匹配模式\d+成功
字符串1010匹配模式\d+成功
字符串100+匹配模式\d+失败
字符串100d匹配模式\d+失败
注:
d表示字母d,\d表示的是数字,不是字母d,前一个'
\'
是转义字符,用来转义第二个'
。
'
\d+'
表示一个或一个以上数字,所以"
就表示一位或多位数字,因此前四个能匹配上,最后一个因为+号是非数字字符而匹配不上.
实例六:
a100"
b20"
c30"
df10000"
gh0t"
\\w+\\d+"
for(Stringstr:
if(result){
System.out.println("
}
字符串a100匹配模式\w+\d+成功
字符串b20匹配模式\w+\d+成功
字符串c30匹配模式\w+\d+成功
字符串df10000匹配模式\w+\d+成功
字符串gh0t匹配模式\w+\d+失败
模式'
\w+'
表示一个或一个以上字母,'
表示一个或一个以上数字,'
\w+\d+'
表示的是以多个单字字符开头,多个数字结尾的字符串,多个两个'
是转义字符,用来转义后面字符'
因此前四个能匹配上,最后一个因为数字后还含有单字字符而不能匹配.
实例七:
Stringstr="
薪水,职位姓名;
年龄性别"
String[]dataArr=str.split("
[,\\s;
]"
for(StringstrTmp:
System.out.println(strTmp);
等同于:
Patternp=Ppile("
String[]dataArr=p.split(str);
for(StringstrTmp:
System.out.println(strTmp);
输出结果都是:
薪水
职位
姓名
年龄
性别
String类的split函数支持正则表达式,上例中模式能匹配”,”,单个空格,”;
”中的一个,split函数能把它们中任意一个当作分隔符,将一个字符串劈
分成字符串数组.
实例八:
2007年12月11日"
[年月日]"
Pattern是一个正则表达式经编译后的表现模式,它的split方法能有效劈分字符串.
注意其和String.split()使用上的不同.
实例九:
10元1000人民币10000元100000RMB"
str=str.replaceAll("
(\\d+)(元|人民币|RMB)"
$1¥"
System.out.println(str);
输出结果:
10¥1000¥10000¥100000¥
实例九-1:
200$2"
200元200人民币200元200RMB
上例中,模式“(\\d+)(元|人民币|RMB)”按括号分成了两组,第一组\\d+匹配单个或多个数字,第二组匹配元,人民币,RMB中的任意一个,替换部分$1表
示第一个组匹配的部分不变,其余组替换成¥.
替换后的str为¥10¥1000¥10000¥100000
实例十:
Pattern.CASE_INSENSITIVE);
//用Pattern类的matcher()方法生成一个Matcher对象
Matcherm=p.matcher("
moonmooonMonmooooonMooon"
StringBuffersb=newStringBuffer();
//使用find()方法查找第一个匹配的对象
booleanresult=m.find();
//使用循环找出模式匹配的内容替换之,再将内容加到sb里
while(result){
m.appendReplacement(sb,"
result=m.find();
//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
替换后内容是"
+sb.toString());
实例10-2:
//Pattern.CASE_INSENSITIVE不区分大小写的匹配
Patternp=Ppile("
Pattern.CASE_INSENSITIVE);
Matcherm=p.matcher("
javakj34kkkkiiiJAVAip34"
System.out.println(m.find());
输出结果:
true
false
实例10-3:
javaJavaJAVaJaVaIloveJAVAyouhateJavaafasdfasdf"
StringBufferbuf=newStringBuffer();
inti=0;
while(m.find()){
i++;
if(i%2==0){
m.appendReplacement(buf,"
}else{
JAVA"
}
System.out.println(buf);
m.appendTail(buf);
//添加尾巴
JAVAjavaJAVAjavaIloveJAVAyouhatejava
JAVAjavaJAVAjavaIloveJAVAyouhatejavaafasdfasdf
10-4实例:
j\\w\\w\\s"
javJavaJAVJaVaIloveJAVAJashateJavaafasdfasdf"
while(m.find()){
i++;
if(i%2==0){
m.appendReplacement(buf,"
good"
}else{
GOOD"
m.appendTail(buf);
System.out.println(buf);
GOODJavagoodJaVaIloveJAVAGOODhateJavaafasdfasdf
实例十一:
除了用+表示一次或多次,*表示0次或多次,?
表示0次或一次外,还可以用{}来指定精确指定出现的次数,X{2,5}表示X最少出现2次,最多出现5次;
X{2,}表
示X最少出现2次,多则不限;
X{5}表示X只精确的出现5次.
例程:
google"
gooogle"
gooooogle"
goooooogle"
ggle"
StringpatternStr="
g(o{2,5})gle"
+str+"
+patternStr+"
}else{
字符串google匹配模式g(o{2,5})gle成功
字符串gooogle匹配模式g(o{2,5})gle成功
字符串gooooogle匹配模式g(o{2,5})gle成功
字符串goooooogle匹配模式g(o{2,5})gle失败
字符串ggle匹配模式g(o{2,5})gle失败
实例十二:
-表示从..到…,如[a-e]等同于[abcde]
Tan"
Tbn"
Tcn"
Ton"
Twn"
Stringregex="
T[a-c]n"
booleanresult=Pattern.matches(regex,str);
+regex+"
实例十三:
不区分大小写匹配.
正则表达式默认都是区分大小写的,使用了Pattern.CASE_INSENSITIVE则不对大小写进行区分.
ab"
Patternpattern=Ppile(patternStr,Pattern.CASE_INSENSITIVE);
String[]dataArr={"
Ab"
AB"
Matchermatcher=pattern.matcher(str);
if(matcher.find()){
实例十四:
使用正则表达式劈分字符串.
注意这里要把复杂的模式写在前面,否则简单模式会先匹配上.
Stringinput="
职务=GM薪水=50000,姓名=职业经理人;
性别=男年龄=45"
(\\s*,\\s*)|(\\s*;
\\s*)|(