正則表達式#
目錄
基礎語法##
標准字符集合
\D 和[^\d]意思一樣,就是與 \d 相反
REG |
意義 |
---|---|
\d digital |
表示 0 到 9 之間任意的一個數字 |
\w world |
表示任意一個字母或數字或下划線 ,不包含¥$%等 |
\s space |
表示包括空格、制表符、換行符等空白字符中任意一個 |
. |
可以匹配任意一個字符 |
自定義的字符集合###
REG |
意義 |
---|---|
[ad# ] 方括號 |
表示匹配 a 或 d 或 # 或 空格 |
^[ad# ] |
表示除方括號以外的字符 |
[a-g] |
表示匹配 a 到 g 之間的字符,別和上面的混淆了 |
[^a-f,0-3] |
匹配除了 a - f 和 0 到 3以外的字符 |
匹配次數
REG |
意義 |
---|---|
(\d){10} |
前面的規則重復匹配了10次 |
{n,m} |
表示至少重復n次,最多重復m次 |
{n,} |
至少n次 |
? |
同{0,1} |
+ |
同{1,} |
* |
同{0,} |
多行、單行模式
- 忽略大小寫:ignorecase
- 單行模式:single line 整個串作為一個模板串
- 多行模式:multi line 模板串分為多個行
字符邊界/匹配位置##
REG |
意義 |
---|---|
^ |
與字符串開始的地方匹配 |
$ |
與字符串結束的地方匹配 |
\b |
表示在邊界處匹配字符,放在左右會不一樣的結果 |
高級語法##
選擇符和分組###
REG |
意思 |
---|---|
\| |
表示‘或’的意思,匹配左邊或右邊 |
() |
對正則表達式分組,更好地組織匹配 |
(?:Expression) |
不把()組中匹配到的字符不保存到group中 |
反向引用###
\nnn
反向引用|把捕獲的字符分組編號,左括號為一個分組
預搜索/零寬斷言###
也是匹配位置
很少用的
REG |
意義 |
---|---|
(\w)(?=Expression) |
匹配以Expression匹配到的字符結尾的字符 |
(\w)(?!Expression) |
匹配不能以Expression匹配到的字符結尾的字符 |
(\w)(?<=Expression) |
位置前面可以匹配Expression |
(\w)(?<!Expression) |
位置后面可以Expression |
表達式 方向 說明
GEG |
意義 |
---|---|
(?=xxx) |
正向預搜索(向右) 正向預搜索,判斷當前位置右側是否能匹配指定表達式 |
(?!xxx) |
正向預搜索(向右) 正向預搜索否定,判斷當前位置右側是否不能夠匹配指定表達式 |
(?<=xxx) |
反向預搜索,反向預搜索,判斷當前位置左側是否能夠匹配指定表達式 |
例子##
匹配郵箱###
要考慮的問題:
- 把@前面的給匹配了:(\w+)
- 匹配“.”:. (因為“.”表示任意字符,所以要轉義一下才能匹配到“.”)
- 把@后面的域名給匹配了,要考慮多層域名的匹配
- 用戶名和域名中的大小寫
- 用戶名中含有 “.”
- 並不允許用戶名中出現”-“
第一版
沒能匹配到用戶名中有 ”.“的郵箱
(\w+)@(\w+)(\.[a-zA-Z]{2,5}){1,2}
2989389@qq.com
adfj32KddkfKJAD@163.com
ajdf23AKDJFO@yahoo.com.cn
akdjf239290@guet.org
KFADJSFOAJDSFOAEJ@GUET.EDU.CN
最終版
(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})
這個可以匹配用戶名含有“.“的郵箱
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchMail {
public static void main(String[] args) {
//正則表達式
Pattern p = Pattern.compile("(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})");
//待匹配的字符串
String str = "2989389@qq.com"
+ "adfj32KddkfKJAD@163.com"
+ "ajdf23AKDJFO@yahoo.com.cn"
+ "akdjf239290@guet.org"
+ "KFADJSFOAJDSFOAEJ@GUET.EDU.CN"
+"23jka32ir.323dfj@qq.com"
+"23rfasdf.com.@163.qq.com"
;
//用正則表達式去匹配字符串
Matcher m = p.matcher(str);
int i = 0;
//如果發現,m.find()則為true
while(m.find())
{
//每一組匹配到的字符都被放到了group里
System.out.println(m.group(0));
i++;
}
System.out.println(i);
}
}
中文字符###
[\u4e00-\u9fa5]
用正則表達式取出正則表達式中括號里的數據
package atest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Aa {
public static void main(String args[]) throws Exception {
// 用正則表達式把字符串中的浮點數提取出來
// "\\d*[.]\\d*" 不能處理 .t3
// “\\(.*?\\)” 也是可以的
Pattern p = Pattern.compile("[\\d]+\\.[\\d]+");
String u = "Mv(2.50),Tl(3.25),3.t3,3.,3..,Tr(3.26),Bk(2.16)";
Matcher m = p.matcher(u);
// 統計有多少個浮點數
int i = 0;
while (m.find()) {
System.out.println(m.group());
i++;
}
System.out.println(i);
}
}
匹配IP地址###
- 匹配:三個字符一個點 三個字符一個點 三個字符一個點 三個字符
- IP地址<255
- IP地址的數字不能以0開始,如:012.
- 第一版:
((\d{1,3})\.){3}\d{1,3}
把562.264.351也匹配了,沒能確定IP地址<255
- 第二版(最終版)
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
/ **
* 最簡潔的IP判斷正則表達式
* 25[0-5] 250-255
* 2[0-4]\d 200-249
* [01]?\d\d? 000-199(0-9 \d)(10-99 \d\d)(100-99 1\d\d)
* ($|(?!\.$)\.) 結束 或者 不以.結束的加上.
* (?!^0{1,3}(\.0{1,3}){3}$) 排除 0.0.0.0 /^(?!^0{1,3}(\.0{1,3}){3}$)((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/
* (?!^255(\.255){3}$) 排除 255.255.255.255
*/
電話、手機號碼##
固定電話7位數,包含0開頭和”—”
移動電話11位數,以13或15開頭
(0\d{2,3}-\d{7,9})|(1[35]\d{9})
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestCode {
public static void main(String[] args) {
Pattern p = Pattern.compile("(0\\d{2,3}-\\d{7,9})|(1[35]\\d{9})");
String str = "15907877344"
+ "0774-1593849"
+ "13877477862"
+ "1555615951"
+ "6651651565151"
+ "13515a1dfa91w13"
+ "434$tfsf51asf51"
+ "8E94 WE8";
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group(0));
}
}
}
所用到的工具是RegexBuddy