java学习:正则表达式
正则表达式中元字符的用法:
一、元字符的用法
元字符 | 说明 |
. | 匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”,“bug”,“b g”,但不能匹配“buug” |
$ | 匹配任何结束符。例如正则表达式“EJB$”能够匹配字符串“I like EJB”的末尾,但是不能匹配字符串“J2EE Without EJBs!” |
^ | 匹配一行的开始。例如正则表达式“^Spring”能够匹配字符串“Spring is a J2EE”的开始,但是不能匹配“I use Spring in my project” |
* | 匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配“z”以及“zoo”;正则表达式“.*”意味着能够匹配任意字符串 |
\ | 转义符,用来将元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾;正则表达式\.用来匹配点字符,而不是任何字符的通配符 |
[] | 匹配括号中的任何一个字符。例如正则表达式“b[aiu]”匹配bag,big和bug,但是不匹配beg。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”就可以匹配“a0c”,“a1c”,“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母。还有一个相配合使用的元字符“^”,用在这里并不像前边的那个“^”一样表示匹配行开始,而是表示排除,例如“[&163A-Z]”将能够匹配除了1,6,3和所有大写字母之外的任何字符 |
() | 将()之间括起的表达式定义为组(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。 |
| | 将两个匹配条件进行逻辑“或”运算。“z|food”能匹配“z”或“food”。“(z|f)ood”则能匹配“zood”或“food” |
+ | 匹配前面的子表达式,1次或多次。例如正则表达式9+匹配9,99,999等 |
? | 匹配前面的子表达式,0次或多次,例如,“do(es)?”可以匹配“do”或“does”中的“do”。此元字符还有另外一个用途,就是表示非贪婪模式匹配 |
{n} | 匹配确定的n次。例如,“e{2}”不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e” |
{n,} | 至少匹配n次。例如“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeed”中的所有“e” |
{n,m} | 最少匹配n次且最多匹配m次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e” |
二、Java中的正则表达式API
jdk1.4开始提供了支持正则表达式的API,它们位于java.util.regex包中。之前的版本,则需要借助于第三方库。
java.util.regex中定义了一些表达式的简写,可以使得表达式显得更加简洁和清晰
\t | 制表符,等同于\u0009 |
\n | 换行符,等同于\u000A |
\d | 代表一个数字,等同于[0-9] |
\D | 代表非数字,等同于[^0-9] |
\s | 代表换行符,制表符等空白字符 |
\S | 代表非空白字符 |
\w | 字母字符,等同于[a-zA-Z_0-9] |
\W | 非字母字符,等同于[^\w] |
三,正则表达式的使用。
前面是基础,非常重要,因此专门抄了一遍。
代码相对而言反而简单:
{
//匹配
System.out.println( Pattern.matches("[0-9]{6}", "100830") );//true
System.out.println( Pattern.matches("\\d{6}", "123456"));//true
}
{
//提取文件名
String regEx = ".+/(.+)$";//这儿()表示分组的概念,分组的索引是从1开始的,
//因此后面取得第一个分组的方法是m.group(1)
String strpath = "c:/dir1/dir2/name.txt";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(strpath);
if(m.find())
System.out.println(m.group(1));//name.txt
else
System.out.println("文件格式错误!");
}
{
//字符替换
String regEx = "a+";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher("okaaaa LetmeAseeaaa aa booa");
String s = m.replaceAll("A");
System.out.println(s);//okA LetmeAseeA A booA
}
{
//验证身份证号
System.out.println(Pattern.matches("\\d{15}|\\d{18}", "123456789012345")); //true
}
{
//中文提取
String f = "welcome to china, 靠山啊,yes,谢谢!" ;
Pattern p = Pattern.compile("[\\u4E00-\\u9FFF]+");
Matcher matcher = p.matcher(f);
StringBuffer sb = new StringBuffer();
while(matcher.find())
{
sb.append(matcher.group());
}
System.out.println(sb);
}
//验证Email
private static void validateEmail(String mail)
{
Pattern p = Pattern.compile("[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+");
Matcher m = p.matcher(mail);
if(m.matches())
{
System.out.println("合法的email");
}
else
{
System.out.println("非法的email");
}
}
public static void main( String[] args )
{
validateEmail("email@mail.com");
validateEmail("www.baidu.com");
}
以下例子为解析URL
public class URLInfo
{
private String protocal;
private String path;
private String host;
public URLInfo()
{
super();
}
public String getHost()
{
return host;
}
public void setHost(String host)
{
this.host = host;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
public String getProtocal()
{
return protocal;
}
public void setProtocal(String protocal)
{
this.protocal = protocal;
}
}
public class Reg08ExtractURL
{
public static void main(String[] args)
{
URLInfo urlinfo = parseURL("ftp://www.ftp.com/incoming/movie.rm");
System.out.println(String.format("protocal:%s, host:%s, path:%s",
urlinfo.getProtocal(), urlinfo.getHost(), urlinfo.getPath()));
URLInfo urlinfo2 = parseURL("http://www.163.com/index.jsp?userId=00333");
System.out.println(String.format("protocal:%s, host:%s, path:%s",
urlinfo2.getProtocal(), urlinfo2.getHost(), urlinfo2.getPath()));
}
private static URLInfo parseURL(String url)
{
Pattern p = Pattern.compile("([a-zA-Z]+)://([^/:]+)([^#]*)");
Matcher mat = p.matcher(url);
mat.find();
URLInfo info = new URLInfo();
info.setProtocal(mat.group(1));
info.setHost(mat.group(2));
info.setPath(mat.group(3));
return info;
}
}