Java正则表达式

由于是综合几篇别人的文章结合起来的,转载来源不一一列出。


Java对正则表达式的处理集中在以下两个两个类:
java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。

java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果

关于这两个类的说明:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

Pattern类的方法简述

方法说明
static Pettern compile(String regex,int flag)编译模式,参数regex表示输入的正则表达式,flag表示模式类型(Pattern.CASE_INSENSITIVE 表示不区分大小写)
Matcher match(CharSequence input)获取匹配器,input时输入的待处理的字符串
static boolean matches(String regex, CharSequence input)快速的匹配调用,直接根据输入的模式regex匹配input
String[] split(CharSequence input,int limit)分隔字符串input,limit参数可以限制分隔的次数


Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。首先一个Pattern实例订制了一个所用语法与 PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。

Matcher类的方法简述
方法说明
boolean matches()对整个输入字符串进行模式匹配.
boolean lookingAt()从输入字符串的开始处进行模式匹配
boolean find(int start)从start处开始匹配模式
int groupCount()返回匹配后的分组数目
String replaceAll(String replacement)用给定的replacement全部替代匹配的部分
String repalceFirst(String replacement)用给定的replacement替代第一次匹配的部分 
Matcher appendReplacement(StringBuffer sb,String replacement)根据模式用replacement替换相应内容,并将匹配的结果添加到sb当前位置之后
StringBuffer appendTail(StringBuffer sb)将输入序列中匹配之后的末尾字串添加到sb当前位置之后.


一些容易迷糊的问题(这段为转载)

 
1、Java对反斜线处理的问题
 
在其他语言中,\\表示要插入一个字符\;
在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。
 
看API文档:
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
 
但是看看上面程序,对比下不难看出:
\d在实际使用的时候就写成了 \\d ;
 
 
在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成 \\\\ ,原因是下面的APIDoc定义\\表示一个反斜线。
但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.
 
字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符

Java正则表达式常用的四种功能:
查询:
  
以下是代码片段:
String str="abc efg ABC";

String regEx="a|f"; //表示a或f

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

  
  如果str中有regEx,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
  
   提取:

以下是代码片段:
String regEx=".+\(.+)$";

String str="c:\dir1\dir2\name.txt";

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

for(int i=1;i<=m.groupCount();i++){

System.out.println(m.group(i));

}

  
  以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupCount();
  
   分割:
  
以下是代码片段:
String regEx="::";

Pattern p=Pattern.compile(regEx);

String[] r=p.split("xd::abc::cde");

执行后,r就是{"xd","abc","cde"},其实分割时还有跟简单的方法:

String str="xd::abc::cde";

String[] r=str.split("::");

  
   替换(删除):
  
以下是代码片段:
String regEx="a+"; //表示一个或多个a

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher("aaabbced a ccdeaa");

String s=m.replaceAll("A");
  
  结果为"Abbced A ccdeA"
  
  如果写成空串,既可达到删除的功能,比如:
  
String s=m.replaceAll("");
  
  结果为"bbced ccde"


使用实例:
正则表达式默认都是区分大小写的,使用了Pattern.CASE_INSENSITIVE则不对大小写进行区分.

 String patternStr
= " ab " ;
    Pattern pattern
= Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
    
    String[] dataArr 
=  {  " ab " " Ab " " AB " };
    
    
for  (String str : dataArr) {
      Matcher matcher
= pattern.matcher(str);
      
      
if (matcher.find()){
        System.out.println(
" 字符串 "   +  str  +   " 匹配模式 "   +  patternStr  +   " 成功 " );
      }
    }



附上Java常用正则表达式:
"^\d+$"  //非负整数(正整数 + 0)
"^\[0-9\]*\[1-9\]\[0-9\]*$"  //正整数
"^((-\d+)\|(0+))$"  //非正整数(负整数 + 0)
"^-\[0-9\]*\[1-9\]\[0-9\]*$"  //负整数
"^-?\d+$"    //整数
"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)
"^((\[0-9\]+\.\[0-9\]*\[1-9\]\[0-9\]*)\|(\[0-9\]*\[1-9\]\[0-9\]*\.\[0-9\]+)\|(\[0-9\]*\[1-9\]\[0-9\]*))$"  //正浮点数
"^((-\d+(\.\d+)?)\|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0)
"^(-((\[0-9\]+\.\[0-9\]*\[1-9\]\[0-9\]*)\|(\[0-9\]*\[1-9\]\[0-9\]*\.\[0-9\]+)\|(\[0-9\]*\[1-9\]\[0-9\]*)))$"  //负浮点数
"^(-?\d+)(\.\d+)?$"  //浮点数
"^\[A-Za-z\]+$"  //由26个英文字母组成的字符串
"^\[A-Z\]+$"  //由26个英文字母的大写组成的字符串
"^\[a-z\]+$"  //由26个英文字母的小写组成的字符串
"^\[A-Za-z0-9\]+$"  //由数字和26个英文字母组成的字符串
"^\w+$"  //由数字、26个英文字母或者下划线组成的字符串
"^\[\w-\]+(\.\[\w-\]+)*@\[\w-\]+(\.\[\w-\]+)+$"    //email地址
"^\[a-zA-z\]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
/^(d{2}\|d{4})-((0(\[1-9\]{1}))\|(1\[1\|2\]))-((\[0-2\](\[1-9\]{1}))\|(3\[0\|1\]))$/&nbsp;&nbsp; //&nbsp; 年-月-日
/^((0(\[1-9\]{1}))\|(1\[1\|2\]))/((\[0-2\](\[1-9\]{1}))\|(3\[0\|1\]))/(d{2}\|d{4})$/&nbsp;&nbsp; // 月/日/年
"^(\[w-.\]+)@((\[\[0-9\]{1,3}.\[0-9\]{1,3}.\[0-9\]{1,3}.)\|((\[w-\]+.)+))(\[a-zA-Z\]{2,4}\|\[0-9\]{1,3})(\]?)$"&nbsp;&nbsp; //Emil
"(d+-)?(d{4}-?d{7}\|d{3}-?d{8}\|^d{7,8})(-d+)?"   //电话号码
"^(d{1,2}\|1dd\|2\[0-4\]d\|25\[0-5\]).(d{1,2}\|1dd\|2\[0-4\]d\|25\[0-5\]).(d{1,2}\|1dd\|2\[0-4\]d\|25\[0-5\]).(d{1,2}\|1dd\|2\[0-4\]d\|25\[0-5\])$"&nbsp;&nbsp; //IP地址

匹配中文字符的正则表达式: \[\u4e00-\u9fa5\]
匹配双字节字符(包括汉字在内):\[^\x00-\xff\]
匹配空行的正则表达式:\n\[\s\| \]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>\|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)\|(\s*$)
匹配Email地址的正则表达式:\w+(\[-+.\]\w+)*@\w+(\[-.\]\w+)*\.\w+(\[-.\]\w+)\*
匹配网址URL的正则表达式:^\[a-zA-z\]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^\[a-zA-Z\]\[a-zA-Z0-9_\]{4,15}$
匹配国内电话号码:(\d{3}-\|\d{4}-)?(\d{8}\|\d{7})?
匹配腾讯QQ号:^\[1-9\]*\[1-9\]\[0-9\]*$



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值