您的位置:首页 > 其它

正则表达式总结

2015-07-19 16:29 239 查看
转义字符
意义
ASCII码值(十进制)
\a
响铃(BEL)
007
\b
退格(BS),将当前位置移到前一列
008
\f
换页(FF),将当前位置移到下页开头
012
\n
换行(LF),将当前位置移到下一行开头
010
\r
回车(CR),将当前位置移到本行开头
013
\t
水平制表(HT)(跳到下一个TAB位置)
009
\v
垂直制表(VT)
011
\\
代表一个反斜线字符''\'
092
\'
代表一个单引号(撇号)字符
039
\"
代表一个双引号字符
034
\0
空字符(NULL)
000
\ddd
1到3位八进制数所代表的任意字符
三位八进制
\xhh
1到2位十六进制所代表的任意字符
二位十六进制
注意:区分,斜杠:"/"与反斜杠:"\",此处不可互换

表1.1正则表达式语法

元字符
说明
.
匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b
g”,但是不匹配“buug”。
$
匹配行结束符。例如正则表达式“EJB$”能够匹配字符串“IlikeEJB”的末尾,但是不能匹配字符串“J2EE
WithoutEJBs!”。
^
匹配一行的开始。例如正则表达式“^Spring”能够匹配字符串“SpringisaJ2EEframework”的开始,但是不能匹配“I
useSpringinmyproject”。
*
匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配“z”以及“zoo”;正则表达式“.*”意味着能够匹配任意字符串。
\
转义符,用来将元字符当作普通的字符来进行匹配。例如正则表达式/$被用来匹配美元符号,而不是行尾;正则表达式/.用来匹配点字符,而不是任何字符的通配符。
[]
匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bug、big和bug,但是不匹配beg。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母。还有一个相配合使用的元字符“^”,用在这里并不像前边的那个“^”一样表示匹配行开始,而是表示“排除”,要想匹配除了指定区间之外的字符,就可以在左边的括号和第一个字符之间使用^字符,例如“[^163A-Z]”将能偶匹配除了1、6、3和所有大写字母之外的任何字符。
()
将()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。
|
将两个匹配条件进行逻辑“或”运算。'z|food'能匹配
"z"或"food"。'(z|f)ood'则匹配"zood"或
"food"。
+
匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。
?
匹配前面的子表达式零次或一次。例如,"do(es)?"可以匹配"do"或"does"
中的"do"。此元字符还有另外一个用途,就是表示非贪婪模式匹配,后边将有介绍
{n}
匹配确定的n
次。例如,“e{2}”不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。
{n,}
至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。
{n,m}
最少匹配n次且最多匹配m
次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
/\{\{(.+?)\}\}/g

最前面的“/”与最后面的“/”是分隔符,表示正则表达式的开始与结束。

最后的“g”标志表示正则表达式使用的global(全局)的状态。使用global标志表明在被查找的字符串中搜索操作将查找所有符合的项,而不仅仅是第一个。这也被称为全局匹配。【相关的标志还有i(ignoreCase,表示忽略大小写)、m(multiline,表示允许跨行)】

然后我们再来看中间的主体部分:\{\{(.+?)\}\}花括号{}是正则里的限定符。但是我们这里是要找字符串里的花括号,所以前面加个“\”来表示是要找字符的花括号。“\{\{”“\}\}”就是找前后两组花括号。

“.”表示任意字符。“+”表示前面表达式一次乃至多次。“?”表示匹配模式是非贪婪的。

/\{\{(.+?)\}\}/g完整的意思就是:在全部范围内查找匹配前后有两组花括号的字符串。

例如:“{{}}”、“{{asdfasdfasdf56745}}”、“{{yuyuy#$%87879+_)(*)87}}”





group是针对()来说的,group(0)就是指的整个串,group(1)指的是第一个括号里的东西,group(2)指的第二个括号里的东西。


importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
publicclassPatternTest{

publicstaticvoidmain(String[]args){
//Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串---北京市
Stringtext="北京市(海淀区)(朝阳区)(西城区)";
Patternpattern=Pattern.compile(".*?(?=\\()");
Matchermatcher=pattern.matcher(text);
if(matcher.find()){
System.out.println(matcher.group(0));
}
//查找以Java开头,任意结尾的字符串--true
Patternpattern=Pattern.compile("^Java.*");
Matchermatcher=pattern.matcher("Java不是人");
booleanb=matcher.matches();
//当条件满足时,将返回true,否则返回false
System.out.println(b);

//以多条件分割字符串时
/*Java
Hello
World
Java
Hello
World
Sun*/
Patternpattern=Pattern.compile("[,|]+");
String[]strs=pattern.split("JavaHelloWorldJava,Hello,,World|Sun");
for(inti=0;i<strs.length;i++){
System.out.println(strs[i]);
}

//文字替换(首次出现字符)--JavaHelloWorld,正则表达式HelloWorld
Patternpattern=Pattern.compile("正则表达式");
Matchermatcher=pattern.matcher("正则表达式HelloWorld,正则表达式HelloWorld");
//替换第一个符合正则的数据
System.out.println(matcher.replaceFirst("Java"));
//文字替换(全部)---JavaHelloWorld,JavaHelloWorld
Patternpattern=Pattern.compile("正则表达式");
Matchermatcher=pattern.matcher("正则表达式HelloWorld,正则表达式HelloWorld");
//替换第一个符合正则的数据
System.out.println(matcher.replaceAll("Java"));
//文字替换(置换字符)---JavaHelloWorld,JavaHelloWorld
Patternpattern=Pattern.compile("正则表达式");
Matchermatcher=pattern.matcher("正则表达式HelloWorld,正则表达式HelloWorld");
StringBuffersbr=newStringBuffer();
while(matcher.find()){
matcher.appendReplacement(sbr,"Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
//验证是否为邮箱地址---true
Stringstr="ceponline@yahoo.com.cn";
Patternpattern=Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
Matchermatcher=pattern.matcher(str);
System.out.println(matcher.matches());
//截取http://地址---http://dsds/r/n
Patternpattern=Pattern.compile("(http://|https://){1}[\\w\\.\\-\\:]+");
Matchermatcher=pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBufferbuffer=newStringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("/r/n");
System.out.println(buffer.toString());
}
//去除html标记---主页
Patternpattern=Pattern.compile("<.+?>",Pattern.DOTALL);
Matchermatcher=pattern.matcher("<ahref=\"index.html\">主页</a>");
Stringstring=matcher.replaceAll("");
System.out.println(string);
//查找html中对应条件字符串---index.html
Patternpattern=Pattern.compile("href=\"(.+?)\"");
Matchermatcher=pattern.matcher("<ahref=\"index.html\">主页</a>");
if(matcher.find()){
System.out.println(matcher.group(1));
}
//matcher.group的使用
/*Group0:World!
Group1:or
Group2:ld!
Start0:6End0:12
Start1:7End1:9
Start2:9End2:12
Wor*/
Stringstr="Hello,World!inJava.";
Patternpattern=Pattern.compile("W(or)(ld!)");
Matchermatcher=pattern.matcher(str);
while(matcher.find()){
System.out.println("Group0:"+matcher.group(0));//得到第0组——整个匹配
System.out.println("Group1:"+matcher.group(1));//得到第一组匹配——与(or)匹配的
System.out.println("Group2:"+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式
System.out.println("Start0:"+matcher.start(0)+"End0:"+matcher.end(0));//总匹配的索引
System.out.println("Start1:"+matcher.start(1)+"End1:"+matcher.end(1));//第一组匹配的索引
System.out.println("Start2:"+matcher.start(2)+"End2:"+matcher.end(2));//第二组匹配的索引
System.out.println(str.substring(matcher.start(0),matcher.end(1)));//从总匹配开始索引到第1组匹配的结束索引之间子串——Wor
}
//替换指定{}中文字--Java目前的发展史是由1995年-2007年
Stringstr="Java目前的发展史是由{0}年-{1}年";
String[][]object={newString[]{"\\{0\\}","1995"},newString[]{"\\{1\\}","2007"}};
System.out.println(replace(str,object));

//匹配连续的相同字符
Stringreg="(.)\\1";
Stringstr="aa";

Patternp=Pattern.compile(reg);

Matcherm=p.matcher(str);

while(m.find()){
System.out.println("ok");
}
}
publicstaticStringreplace(finalStringsourceString,Object[]object){
Stringtemp=sourceString;
for(inti=0;i<object.length;i++){
String[]result=(String[])object[i];
Patternpattern=Pattern.compile(result[0]);
Matchermatcher=pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
returntemp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: