正則表達(dá)式學(xué)習(xí)筆記
一、常用正則表達(dá)式
1、匹配字母 Pattern pattern=Pattern.compile("[a-zA-Z]+");
2、匹配數(shù)字 Pattern pattern=Pattern.compile("[0-9]+");
3、匹配字母和數(shù)字 Pattern pattern=Pattern.compile("([0-9]+)|([a-zA-Z]+)");
4、匹配百度排行榜 Pattern pattern=Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
5、匹配IP地址:Pattern pattern=Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");
6、匹配4位數(shù)字:Pattern pattern=Pattern.compile("\\d\\d\\d\\d");
7、匹配
二、需要轉(zhuǎn)義的字符
.*+()$/\?[]^{}
字符 | 說明 |
---|---|
\ | 將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符。 例如:“n"匹配字符串"n”?!癨n"匹配換行符。序列”\\“匹配”\“,”\(“匹配”("。 |
^ | 匹配輸入字符串開始的位置。 如果設(shè)置了RegExp對(duì)象的Multiline屬性,^還會(huì)與"\n"或"\r"之后的位置匹配。 |
$ | 匹配輸入字符串結(jié)尾的位置。 如果設(shè)置了RegExp對(duì)象的Multiline屬性,$還會(huì)與"\n"或"\r"之前的位置匹配。 |
? | 當(dāng)此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時(shí),匹配模式是“非貪心的”。 “非貪心的”模式匹配搜索到的、盡可能短的字符串,而默認(rèn)的“貪心的”模式匹配搜索到的、盡可能長(zhǎng)的字符串。 例如:在字符串“oooo”中,"o+?“只匹配單個(gè)"o”,而"o+“匹配所有"o”。 |
三、元字符
符號(hào) | 含義 | 示例 | 說明 | 匹配輸入 |
---|---|---|---|---|
[] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意1個(gè)字符 | |
[^] | 不可接收的字符列表 | [^abc] | 除a、b、c之外的任意1個(gè)字符,包括數(shù)字和特殊符號(hào) | |
- | 連字符 | A-Z | 任意單個(gè)大寫字母 | |
. | 匹配除\n以外的任何字符 | a…b | 以a開頭,b結(jié)尾,中間包括2個(gè)任意字符的長(zhǎng)度為4的字符串 | aaab、aefb、a35b、a#*b |
\d | 匹配單個(gè)數(shù)字字符,相當(dāng)于[0-9] | \\d{3}(\\d)? | 包含3個(gè)或4個(gè)數(shù)字的字符串 | 123、9876 |
\D | 匹配單個(gè)非數(shù)字字符串,相當(dāng)于[^0-9] | \\d(\\d)* | 以單個(gè)非數(shù)字字符串開頭,后接任意個(gè)數(shù)字字符串 | a、A342 |
\w | 匹配單個(gè)數(shù)字、大小寫字母字符,相當(dāng)于[0-9a-zA-Z_] | \\d{3}\\w{4} | 以3個(gè)數(shù)字字符串開頭的長(zhǎng)度為7的數(shù)字字母字符串 | 234abcd、12345Pe |
\W | 匹配單個(gè)非數(shù)字、大小寫字符,相當(dāng)于[^0-9a-zA-Z_] | \\W+\\d{2} | 以至少1個(gè)非數(shù)字字母字符開頭,2個(gè)數(shù)字字符結(jié)尾的字符串 | #29、#?@10 |
(?i) | 不區(qū)分大小寫 | (?i)abc、a(?i)bc、a((?i)b)c | 1、abc都不區(qū)分大小寫;2、bc不區(qū)分大小寫;3、僅b不區(qū)分大小寫 | |
\\s | 匹配任何空白字符(空格,制表符等) | |||
\\S | 匹配任何非空白字符(空格,制表符等) | |||
豎杠 | 匹配豎杠之前或之后的表達(dá)式 |
四、限定符
五、Java調(diào)用代碼
逐個(gè)匹配(注意定位符)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
Pattern pattern=Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");
//Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);// 不區(qū)分大小寫
Matcher matcher = pattern.matcher(content); // 逐個(gè)匹配
while(matcher.find()) {
System.out.println("--> "+matcher.group(0));
}
}
整體匹配(推薦使用)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
String pattern=".*hao.*";
boolean isMatch=Pattern.matches(pattern,content);// 整體匹配
System.out.println(isMatch);
}
常用其他方法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
Pattern pattern=Pattern.compile("hao123");
Matcher matcher = pattern.matcher(content);
String newStr=matcher.replaceAll("好的");// 匹配后替換(注意:原字符串保持不變)
}
六、分組
1、捕獲分組
常用分組構(gòu)造形式 | 說明 |
---|---|
(pattern) | 非命名捕獲。 捕獲匹配的字符串。 編號(hào)為零的第一個(gè)捕獲是由整個(gè)正則表達(dá)式模式匹配的文本, 其他捕獲結(jié)果則根據(jù)左括號(hào)的順序從1開始自動(dòng)編號(hào)。 |
(?<name>pattern) | 命名捕獲。 |
舉例:
String regStr="(?<g1>\\d\\d)(?<g2>\\d\\d)";
matcher.group(0); // 找到的整體數(shù)據(jù)
matcher.group(1);// 找到的第一個(gè)分組內(nèi)容
matcher.group(“g1”);// 找到的分組名稱為g1的內(nèi)容;
2、非捕獲分組(特別分組)
常用分組構(gòu)造形式 | 說明 |
---|---|
(?:pattern) | 匹配pattern但不捕獲該匹配的子表達(dá)式,即它是一個(gè)非捕獲匹配,不存儲(chǔ)供以后使用的匹配。 這對(duì)于用“or”字符(|)組合模式部件的情況很有用。 例如:'industr(?:y|ies)'是比’industry|industries’更經(jīng)濟(jì)的表達(dá)式。 |
(?=pattern) | 它是一個(gè)非捕獲匹配。 例如:'Windows(?=95|98|NT|2000)'匹配’Windows 2000’中的"Windows",但不匹配"Windows 3.1"中的"Windows"。 |
(?!pattern) | 該表達(dá)式匹配不處于匹配pattern的字符串的起始點(diǎn)的搜索字符串。 它是一個(gè)非捕獲匹配。 例如:'Windows(?!95|98|NT|2000)'匹配"Windows 3.1"中的"Windows",但不匹配"Windows 2000"中的"Windows"。 |
3、反向引用
說明:內(nèi)部反向引用:\\分組號(hào)
,外部反向引用 $分組號(hào)
。
- 匹配兩個(gè)連續(xù)的相同數(shù)字:
(\\d)\\1
- 匹配五個(gè)連續(xù)相同的數(shù)字:
(\\d)\\1{4}
- 匹配個(gè)位與千位相同,十位與百位相同的數(shù)字,比如:5225,1551 正則:
(\\d)(\\d)\\2\\1
- 匹配商品編號(hào),形式如:12312-333-999-111,格式描述:5位數(shù)字開頭,然后一個(gè)-,然后一個(gè)9位數(shù),連續(xù)的每3位相同。正則:
\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}
應(yīng)用:將結(jié)巴的字去除掉。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
public static void main(String[] args) {
String regStr="我我要吃吃吃吃飯飯";
Pattern compile = Pattern.compile("(.)\\1+");
Matcher matcher = compile.matcher(regStr);
String str = matcher.replaceAll("$1");
System.out.println(str);
// 簡(jiǎn)寫
String str=Pattern.compile("(.)\\1+").matcher(regStr).replaceAll("$1");
}
}
結(jié)果:
我要吃飯
4、java String類中使用正則表達(dá)式
舉例:
1、替換:要求使用正則表達(dá)式,將JDK1.3 和 JDK1.4 替換成 JDK
content=content.replaceAll("JDK1\\.3|JDK1\\.4","JDK");
2、驗(yàn)證:手機(jī)號(hào),必須是:138 139 開頭
String content="13688888888";
if(content.matches("1(38|39)\\d{8}")){
System.out.println("ok");
}
3、分割:要求按照 # 或 - 或 ~ 或 數(shù)字 來分割
String content="hello#abc-jack12smith~北京";
String[] split=content.spllit("#|-|~|\\d+");
七、補(bǔ)充字符(不常用字符)
字符 | 說明 |
---|---|
\b | 匹配一個(gè)字邊界,即字與空格間的位置。 例如:"er\b"匹配“never”中的er,但不匹配“verb”中的“er”。 |
\B | 非邊界匹配。 例如: “er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。 |
\cx | 匹配x指示的控制字符。 例如:\cM 匹配Control-M或回車符。x的值必須在A-Z或a-z之間。如果不是這樣,則假定c就是“c”字符本身。 |
\f | 換頁符匹配。等效于\x0c 和\cL。 |
\n | 換行符匹配。等效于 \X0a 和\cJ。 |
\r | 匹配一個(gè)回車符。等效于 \X0d 和 \cM。 |
\t | 制表符匹配。 與 \x09 和 \cl等效。 |
\v | 垂直制表符匹配。與\x0b 和 \cK等效。 |
\xn | 匹配n,此處的n是一個(gè)十六進(jìn)制轉(zhuǎn)移碼。十六進(jìn)制轉(zhuǎn)移碼必須正好是兩位數(shù)長(zhǎng)。 例如:“\x41"匹配"A”?!癨x041"與”\x04"&"1"等效。允許在正則表達(dá)式中使用ASCII代碼。 |
\num | 匹配num,此處的num是一個(gè)正整數(shù)。到捕獲匹配的反向引用。 例如:"(.)\1"匹配兩個(gè)連續(xù)的相同字符。 |
\n | 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)移碼或反向引用。 如果\n前面至少有n個(gè)捕獲子表達(dá)式,那么n是反向引用。否則,如果n是八進(jìn)制(0-7),那么n是八進(jìn)制轉(zhuǎn)移碼。 |
\nm | 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)移碼或反向引用。 如果\nm前面至少有nm個(gè)捕獲子表達(dá)式,那么nm是反向引用。 如果\nm前面至少有n個(gè)捕獲,則n是反向引用,后面跟有字符串m。 如果兩種前面的情況都不存在,則\nm匹配八進(jìn)制nm,其中n和m是八進(jìn)制數(shù)字(0-7)。 |
\nml | 當(dāng)n是八進(jìn)制數(shù)(0-3),m和l是八進(jìn)制數(shù)(0-7)時(shí),匹配八進(jìn)制轉(zhuǎn)移碼nml。 |
\un | 匹配n,其中n是以四位16進(jìn)制表示的Unicode字符。例如:\u00A9 匹配版權(quán)符號(hào)。 |
八、常用正則表達(dá)式
- 字符串是否全部是漢子: regStr=“^[\u0391-\uffe5]+$”
- 郵政編碼(1-9開頭的一個(gè)6位數(shù)字):regStr=“^[1-9]\\d{5}$”
- QQ號(hào)碼(1-9開頭的一個(gè)(5位數(shù)-10位數(shù))):regStr=“^[1-9\\d{4,9}]$”
- 手機(jī)號(hào)碼(13,14,15,18 開頭的11位數(shù)):regStr=“^1[3|4|5|8]\\d{9}$”;
- URL:
regStr="^((http|https)://)?([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";
- 電子郵件(只有一個(gè)@,@前可以是a-z A-Z 0-9 _-字符,@后面是域名,比如 sohu.com或hao.org.cn)正則:
^[\\w_-]+@([a-zA-Z.]+)[a-zA-Z]+$
- 數(shù)字(包括 +123 -345 34.8 0.9等格式):
^[-+]?([1-9]\\d*|0)(\\.\\d+)?$
== 注意:==[. ? * ] 表示匹配就是. 本身;
九、附錄(摘錄課件)
正則表達(dá)式大全
校驗(yàn)數(shù)字的表達(dá)式:
1、數(shù)字:^[0-9]*$
2、n位的數(shù)字:^\d{n}$
3、至少n位的數(shù)字:^\d{n,}$
4、m-n位的數(shù)字:^\d{m,n}$
5、零和非零開頭的數(shù)字:^(0|[1-9][0-9]*)$
6、非零開頭的最多帶兩位小數(shù)的數(shù)字:^([1-9][0-9]*)+(.[0-9{1,2}])?$
7、帶1-2位小數(shù)的正數(shù)或負(fù)數(shù):^(\-)?\d+(\.\d{1,2})?$
8、正數(shù)、負(fù)數(shù)、和小數(shù):^(\-|\+)?\d+(\.\d+)?$
9、有兩位小數(shù)的正實(shí)數(shù):^[0-9]+(.[0-9]{2})?$
10、有1~3位小數(shù)的正實(shí)數(shù):^[0-9]+(.[0-9]{1,3})?$
校驗(yàn)字符的表達(dá)式:
特殊要求:文章來源:http://www.zghlxwxcb.cn/news/detail-674508.html
十、完結(jié)
…文章來源地址http://www.zghlxwxcb.cn/news/detail-674508.html
到了這里,關(guān)于正則表達(dá)式學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!