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;
    }
}
原文地址:https://www.cnblogs.com/luhouxiang/p/2182233.html