標籤:
1、Regex的知識要點
1、Regex是什嗎?
Regex是一種可以用於模式比對和替換的強有力的工具。
2、Regex的優點?
更少的代碼,更高的效率。
3、Regex如何使用?
在下面的教程中我們將學習到Regex的用法。
4、Regex的缺點?
需要花一定的時間學習,這個時間由個人決定,一天或者更久一些。
2、Regex的各種符號及其含義
常用的符號 . 表示任意一個字元
\s 空白字元(空格鍵, tab, 換行, 換頁, 斷行符號)
\S 非空白字元([^\s])
\d 一個數字,(相當於[0-9] )
\D 一個非數位字元,(相當於[^0-9] )
\w 一個單詞字元(word character) (相當於 [a-zA-Z_0-9] )
\W 一個非單詞的字元,[^\w]
^ 一行的開始
$ 一行的結尾
\b 一個單詞的邊界
\B 一個非單詞的邊界
\G 前一個匹配的結束
[] 匹配方括弧內的一個字元
例如:[abc] 表示字元a,b,c中的任意一個(與a|b|c相同)
[a-zA-Z] 表示從a到z或A到Z當中的任意一個字元
表示次數的符號 * 重複零次或更多次
例如:a* 匹配零個或者多個a
+ 重複一次或更多次
例如:a+ 匹配一個或者多個a
? 重複零次或一次
例如:a? 匹配零個或一個a
{n} 重複n次
例如:a{4} 匹配4個a
{n,} 重複n次或更多次
例如:a{4,} 匹配至少4個a
{n,m} 重複n到m次
例如:a{4,10} 匹配4~10個a
2JAVARegex執行個體教程 12/11/2008
3、Regex執行個體
javaRegex通過java.util.regex包下的Pattern類與Matcher類實現:
1、首先引入java包:java.util.regex
2、使用方法如下:
共分三步:
①構造一個模式.
Pattern p=Pattern.compile("[a-z]*");
②建造一個匹配器
Matcher m = p.matcher(str);
③進行判斷,得到結果
boolean b = m.matches();
Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到
時返回true,沒匹配到則返回false
①m.matches()
matches()對整個字串進行匹配,只有整個字串都匹配了才返回true
②m.lookingAt()
lookingAt()對前面的字串進行匹配,只有匹配到的字串在最前面才返
回true
③m.find()
find()對字串進行匹配,匹配到的字串可以在任何位置
Matcher類的其他方法
int groupcount() 返回此匹配器模式中的擷取的群組數。
String replaceAll(String replacement) 用給定的replacement全部替代匹配的
部分
String repalceFirst(String replacement) 用給定的replacement 替代第一次匹
配的部分
appendReplacement(StringBuffer sb,String replacement) 根 據 模 式 用
replacement替換相應內容,並將匹配的結果添加到sb當前位置之後
StringBuffer appendTail(StringBuffer sb) 將輸入序列中匹配之後的末尾字串
添加到sb當前位置之後.
group(n) 0代表永遠都是匹配整個運算式的字串的那部分 n<>0時代表
第n組匹配的部分
①字元匹配
Pattern p = Pattern.compile(expression); // Regex
Matcher m = p.matcher(str); // 操作的字串
boolean b = m.matches(); //返回是否匹配的結果
System.out.println(b);
Pattern p = Pattern.compile(expression); // Regex
3JAVARegex執行個體教程 12/11/2008
Matcher m = p.matcher(str); // 操作的字串
boolean b = m. lookingAt (); //返回是否匹配的結果
System.out.println(b);
Pattern p = Pattern.compile(expression); // Regex
Matcher m = p.matcher(str); // 操作的字串
boolean b = m..find (); //返回是否匹配的結果
System.out.println(b);
②分割字串
Pattern pattern = Pattern.compile(expression); //Regex
String[] strs = pattern.split(str); //操作字串 得到返回的字串數組
③替換字串
Pattern p = Pattern.compile(expression); // Regex
Matcher m = p.matcher(text); // 操作的字串
String s = m.replaceAll(str); //替換後的字串
④尋找替換指定字串
Pattern p = Pattern.compile(expression); // Regex
Matcher m = p.matcher(text); // 操作的字串
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find()) {
m.appendReplacement(sb, str);
i++; //字串出現次數
}
m.appendTail(sb);//從截取點將後面的字串接上
String s = sb.toString();
⑤尋找輸出字串
Pattern p = Pattern.compile(expression); // Regex
Matcher m = p.matcher(text); // 操作的字串
while (m.find()) {
//m.start() 返回匹配到的子字串在字串中的索引位置.
//m.end()返回匹配到的子字串的最後一個字元在字串中的索引位置.
//m.group()返回匹配到的子字串
}
4JAVARegex執行個體教程 12/11/2008
3、下面通過幾個例子來理解一下Regex的妙用
3.1 匹配字串(matches()方法)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示首字母是a,中間是任一字元,結尾以b結束
//不匹配的結果
p = Pattern.compile("a*b");
m = p.matcher("baaaaab");
b = m.matches();
System.out.println("匹配結果:"+b); //輸出:true
//匹配的結果
p = Pattern.compile("a*b");
m = p.matcher("aaaaab");
b = m.matches();
System.out.println("匹配結果:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
5JAVARegex執行個體教程 12/11/2008
3.2 判斷手機號碼(matches()方法)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示第一位是1,第二位為3或5,結尾為9位元字的一串數字
p = Pattern.compile("^[1][3,5]+\\d{9}");
m = p.matcher("13812345678");
b = m.matches();
System.out.println("手機號碼正確:"+b); //輸出:true
//
p = Pattern.compile("[1][3,5]+\\d{9}");
m = p.matcher("03812345678");//錯誤 首位為0
//m = p.matcher("13812345-7a");//錯誤 字串中有字母或者字元
b = m.matches();
System.out.println("手機號碼錯誤:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
6JAVARegex執行個體教程 12/11/2008
3.3 社會安全號碼碼驗證
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示15位或者18位元字的一串數字
p = Pattern.compile("\\d{15}|\\d{18}");
m = p.matcher("120101198506020080");
b = m.matches();
System.out.println("社會安全號碼碼正確:"+b); //輸出:true
//
p = Pattern.compile("\\d{15}|\\d{18}");
m = p.matcher("020101198506020080");//錯誤 首位為0
b = m.matches();
System.out.println("社會安全號碼碼錯誤:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
7JAVARegex執行個體教程 12/11/2008
3.4 email驗證
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示郵箱號碼
p = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+
([-.]\\w+)*");
m = p.matcher("[email protected]");
b = m.matches();
System.out.println("email號碼正確:"+b); //輸出:true
//
p = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+
([-.]\\w+)*");
m = p.matcher("user.test.com");//錯誤 @應為.
b = m.matches();
System.out.println("email號碼錯誤:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
8JAVARegex執行個體教程 12/11/2008
3.5 IP地址檢查
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示郵箱號碼
p =
Pattern.compile("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}");
m = p.matcher("192.168.1.1");
b = m.matches();
System.out.println("IP正確:"+b); //輸出:true
//
p =
Pattern.compile("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}");
m = p.matcher("192.168.1.1234");//錯誤 應該為3位不應該是4位
b = m.matches();
System.out.println("IP錯誤:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
9JAVARegex執行個體教程 12/11/2008
3.6 中文名
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest{
static void test(){
Pattern p = null; //Regex
Matcher m = null; //操作的字串
boolean b = false;
//Regex表示漢字的一串字串
p = Pattern.compile("^[\u4e00-\u9fa5]+$");
m = p.matcher("貂禪");
b = m.matches();
System.out.println("中文名正確:"+b); //輸出:true
//
p = Pattern.compile("^[\u4e00-\u9fa5]+$");
m = p.matcher("nick");//錯誤 只能是中文
b = m.matches();
System.out.println("中文名錯誤:"+b); //輸出:false
}
public static void main(String argus[]){
test();
}
}
10JAVARegex執行個體教程 12/11/2008
3.7 字串匹配的返回
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
static void test() {
/**
* start()返回匹配到的子字串在字串中的索引位置.
* end()返回匹配到的子字串的最後一個字元在字串中的索引位置.
* group()返回匹配到的子字串
*/
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb11222");
while(m.find()){
System.out.println(m.start());//第一個迴圈返回3,第二個迴圈返回
9
System.out.println(m.end());//返回7,第二個迴圈返回14
System.out.println(m.group());//返回2233,第二個返回11222
}
}
public static void main(String argus[]) {
test();
}
}
11JAVARegex執行個體教程 12/11/2008
3.8 groupCount、group()、group(n)的用法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
static void test() {
/*
* 本例groupCount將返回三組a11bbb、11、bbb
*/
Pattern p=Pattern.compile("\\w(\\d\\d)(\\w+)");
Matcher m=p.matcher("aa11bbb");
if(m.find()){
int count = m.groupCount(); //返回匹配組的數目,而不是匹配字串
的數目
for(int i = 0; i <= count; i++)
System.out.println("group " + i + " :" + m.group(i));
}
}
/*
* 返回結果如下
* group 0 :a11bbb
* group 1 :11
* group 2 :bbb
*/
public static void main(String argus[]) {
test();
}
}
12JAVARegex執行個體教程 12/11/2008
3.9 分割字串(split ()方法)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
static void test() {
Pattern p=Pattern.compile("\\d+"); //將所含數字去掉
String str[] = p.split("aa11bbb33cc55gg");
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
/*
* 返回結果如下
* aa
* bbb
* cc
* gg
*/
public static void main(String argus[]) {
test();
}
}
13JAVARegex執行個體教程 12/11/2008
3.10 字串替換(replaceAll()方法)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
static void test() {
Pattern p = Pattern.compile("\\d+"); //將所含數字全部替換為XX
Matcher m = p.matcher("aa11bbb33cc55gg");
String str = m.replaceAll("XX");
System.out.println(str);
}
/*
* 返回結果如下
* aaXXbbbXXccXXgg
*/
public static void main(String argus[]) {
test();
}
}
14JAVARegex執行個體教程 12/11/2008
3.11 字串替換2(appendReplacement()方法及appendTail()方法)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
static void test() {
Pattern p = Pattern.compile("55");
Matcher m = p.matcher("aa11bbb33cc55gg55yy");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "@@");//用@@替換所有的55
}
System.out.println(sb.toString());//列印[email protected]@[email protected]@
m.appendTail(sb);//將最後一次替換後的字串加上
System.out.println(sb.toString());//列印[email protected]@[email protected]@yy
}
/*
* 返回結果如下 [email protected]@[email protected]@、[email protected]@[email protected]@yy
*/
public static void main(String argus[]) {
test();
}
}
15JAVARegex執行個體教程 12/11/2008
4、常用的Regex
//email 正確的書寫格式為 [email protected]
static String _email = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+
([-.]\\w+)*";
//電話 正確格式 012-87654321、0123-87654321、0123-7654321
static String _tel =
"\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)";
//手機號碼 13187654321 13587654321
static String _phone = "^[1][3,5]+\\d{9}";
//漢字 中國
static String _chinse = "^[\u4e00-\u9fa5]+$";
//IP 192.168.1.1
static String _ip =
"\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}";
//QQ 456789
static String _qq = "[1-9][0-9]{4,13}";
//郵編 210000
static String _mail = "[1-9]\\d{5}(?!\\d)";
//社會安全號碼碼 15或者18位
static String _id = "\\d{15}|\\d{18}";
Regex(轉載)