正则表达式总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、正则表达式是用某种模式去匹配一类字符串的公式;有普通字符和元字符组成,
普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。正则表达式的应用
包java.util.regex;

二、正则表达式的使用方法:
1.构造一个模式:Pattern p = pile("[a-z]");//从a到z的小写字母
2.建造一个匹配器:Matcher m = p.matcher(str);//操作的字符串
3.进行判断,得到结果:boolean b = m.matches();
或 boolean b = Pattern.matches("[a-z]",str);//在仅使用一次正则表达式时,不允许重用已经编译的模式,
对于重复的匹配效率不高。

三、正则表达式的作用:
1.查询:查询一个字符串中是否有指定的字符。
例如:
String str="abc efg ABC";
String format="a|f"; //表示a或f
Pattern p=pile(format);
Matcher m=p.matcher(str);
boolean rs=m.find();
如果str中有format,那么rs为true,否则为flase。如果想在查找时忽略大小写,
则可以写成Pattern p=pile(format,Pattern.CASE_INSENSITIVE);
2.提取:
String regEx=".+\(.+)$";
String str="c:\dir1\dir2\name.txt";
Pattern p=pile(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();

3.分割:
String regEx="::";
Pattern p=pile(regEx);
String[] r=p.split("xd::abc::cde");
执行后,r就是{"xd","abc","cde"},其实分割时还有跟简单的方法:
String str="xd::abc::cde";
String[] r=str.split("::");

4.替换(删除):
String regEx="a+"; //表示一个或多个a
Pattern p=pile(regEx);
Matcher m=p.matcher("aaabbced a ccdeaa");
String s=m.replaceAll("A");

结果为"Abbced A ccdeA";如果写成空串,既可达到删除的功能,比如:

String s=m.replaceAll(""); 结果为"bbced ccde"

=========================================
四、正则表达式的构造及相对应的匹配:

1.字符
x 字符 x。例如a表示字符a
\\ 反斜线字符。在书写时要写为\\\\。(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,
在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次)
\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 的控制符

2.字符类
[abc] a、b或 c(简单类)。例如[egd]表示包含有字符e、g或d。
[^abc] 任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。
[a-zA-Z] a到 z或 A到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a到 d或 m到 p:[a-dm-p](并集)
[a-z&&[def]] d、e或 f(交集)
[a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](减去)
[a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](减去)

3.预定义字符类(注意反斜杠要写两次,例如\d写为\\d)任何字符
(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})
\p{Lower} 小写字母字符:[a-z]。
\p{Upper} 大写字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十进制数字:[0-9]
\p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六进制数字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]

5.边界匹配器
^ 行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = pile(regex,Pattern.MULTILINE);
$ 行的结尾,请在正则表达式的结束处使用。例如:(^bca).*(abc$)表示以bca开头以abc结尾的行。
\b 单词边界。例如\b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc 都可以匹配)
\B 非单词边界。例如\B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)
\A 输入的开头
\G 上一个匹配的结尾(个人感觉这个参数没什么用)。例如\\Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹配。
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。
以下代码被识别为行结束符:
‐新行(换行)符 ('\n')、
‐后面紧跟新行符的回车符 ("\r\n")、
‐单独的回车符 ('\r')、
‐下一行字符 ('\u0085')、
‐行分隔符 ('\u2028') 或
‐段落分隔符 ('\u2029)。

6.Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少

n 次
X{n,m} X,至少 n 次,但是不超过 m 次

7.Back 引用
\n 任何匹配的 nth捕获组
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
在表达式中可以通过\n来对相应的组进行引用,例如(ab)34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。

8.引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到 \E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如, ab\\Q{|}\\\\E
可以匹配ab{|}\\
\E Nothing,但是结束从 \Q开始的引用

9.Logical 运算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作为捕获组。例如(abc)表示把abc作为一个整体进行捕获

==================================================================
五、总结与归纳:
在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符
字符: 说明:
^ 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"
$ 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"
( ) 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"
[ ] 用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"
{ } 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"
. 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
? 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"
+ 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"
* 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"
| 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"


六、正则表达式的实例应用:
1.import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args){
//构造一个模式,开头为a,结尾为b,中间是任意字符
Pattern p = pile("a*b");
//构建一个匹配器,baaaaaab的操作的字符串
Matcher m =p.matcher("baaaaaaaaaab");
//进行判断
boolean b = m.matches();
System.out.println(b);//打印结果:false
}

}
2.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PhoneTest {
public static void main(String[] args){
Pattern p = null;//正则表达式
Matcher m = null;//操作的字符串
boolean b = false ;
//第一位是1,第二位是3,5或8,结尾是9位数字
p = pile("^[1][3,5,8]+\\d{9}");
m = p.matcher("138********");
b = m.matches();
System.out.println(b);//true;

}

}
3.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IDTest

{
public static void main(String[] args){
Pattern p = null;//正则表达式
Matcher m = null;//操作的字符串
boolean b = false ;
//15位或者18位
p = pile("\\d{15}|\\d{18}");
m = p.matcher("111111*********");
b = m.matches();
System.out.println(b);//true;

}

}
4.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IPTest {
public static void main(String[] args){
Pattern p = null;//正则表达式
Matcher m = null;//操作的字符串
boolean b = false ;
//
p = pile("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,2}+\\.\\d{1,3}");
m = p.matcher("192.168.80.119");
b = m.matches();
System.out.println(b);//true;

}
}
5.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ChineseTest {

public static void main(String[] args){
Pattern p = null;//正则表达式
Matcher m = null;//操作的字符串
boolean b = false ;
//
p = pile("^[\u4e00-\u9fa5]+$");
m = p.matcher("房金国");
b = m.matches();
System.out.println(b);//true;

}

}
6.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailTest {
public static void main(String[] args){
Pattern p = null;//正则表达式
Matcher m = null;//操作的字符串
boolean b = false ;
//
p = pile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");

m = p.matcher("943134640@");
b = m.matches();
System.out.println(b);//true;

}

}
//**********************************
7.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BirthdayTest {
public static void main(String[] args){
Pattern p = null;
Matcher m = null;
boolean b = false;
p = pile("(^[1-2][0-9][0-9][0-9][-](([0][1,3,5,7,8])|([1][0,2]))[-](([0][0-9])|([1-2][0-9])|([3][0-1]))$)|
(^[1-2][0-9][0-9][0-9][-](([0][4,6,9])|([1][1]))[-](([0][0-9])|([1-2][0-9])|([3][0]))$)");
m = p.matcher("2000-10-01");
b = m.matches();
System.out.println(b);
}

}

8.import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TimeTest {

public static void main(String[] args) {

Pattern p = null;
Matcher m = null;
boolean b = false;
p = pile("(([01]\\d)|(2[0-3])):[0-5]\\d(:[0-5]\\d)");
m = p.matcher("24:40:11");
b = m.matches();
System.out.println(b);
}

}

相关文档
最新文档