作为程序员之正则表达式
目錄
- 正則表達式
- 基礎(chǔ)語法
- 標準字符集合
- 自定義的字符集合
- 多行、單行模式
- 高級語法
- 選擇符和分組
- 反向引用
- 預(yù)搜索/零寬斷言
- 例子
- 匹配郵箱
- 基礎(chǔ)語法
正則表達式
基礎(chǔ)語法
標準字符集合
\D 和[^\d]意思一樣,就是與 \d 相反
| \ddigital | 表示 0 到 9 之間任意的一個數(shù)字 |
| \wworld | 表示任意一個字母或數(shù)字或下劃線,不包含¥$%等 |
| \sspace | 表示包括空格、制表符、換行符等空白字符中任意一個 |
| . | 可以匹配任意一個字符 |
自定義的字符集合
| [ad# ]方括號 | 表示匹配 a 或 d 或 # 或 空格 |
| ^[ad# ] | 表示除方括號以外的字符 |
| [a-g] | 表示匹配 a 到 g 之間的字符,別和上面的混淆了 |
| [^a-f,0-3] | 匹配除了 a - f 和 0 到 3以外的字符 |
匹配次數(shù)
| (\d){10} | 前面的規(guī)則重復(fù)匹配了10次 |
| {n,m} | 表示至少重復(fù)n次,最多重復(fù)m次 |
| {n,} | 至少n次 |
| ? | 同{0,1} |
| + | 同{1,} |
| * | 同{0,} |
多行、單行模式
多行模式:multi line 模板串分為多個行
字符邊界/匹配位置
| ^ | 與字符串開始的地方匹配 | |
| $ | 與字符串結(jié)束的地方匹配 | |
| \b | 表示在邊界處匹配字符,放在左右會不一樣的結(jié)果 |
高級語法
選擇符和分組
| \| | 表示‘或’的意思,匹配左邊或右邊 | |
| () | 對正則表達式分組,更好地組織匹配 | |
| (?:Expression) | 不把()組中匹配到的字符不保存到group中 |
反向引用
\nnn反向引用|把捕獲的字符分組編號,左括號為一個分組
預(yù)搜索/零寬斷言
也是匹配位置
很少用的
| (\w)(?=Expression) | 匹配以Expression匹配到的字符結(jié)尾的字符 | |
| (\w)(?!Expression) | 匹配不能以Expression匹配到的字符結(jié)尾的字符 | |
| (\w)(?<=Expression) | 位置前面可以匹配Expression | |
| (\w)(?<!Expression) | 位置后面可以Expression |
表達式 方向 說明
|GEG|意義|
|:----|----:|----:|
|(?=xxx)|正向預(yù)搜索(向右) 正向預(yù)搜索,判斷當(dāng)前位置右側(cè)是否能匹配指定表達式 |
|(?!xxx) | 正向預(yù)搜索(向右) 正向預(yù)搜索否定,判斷當(dāng)前位置右側(cè)是否不能夠匹配指定表達式 |
|(?<=xxx)| 反向預(yù)搜索,反向預(yù)搜索,判斷當(dāng)前位置左側(cè)是否能夠匹配指定表達式|
例子
匹配郵箱
要考慮的問題:
第一版
沒能匹配到用戶名中有 ”.“的郵箱
(\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
最終版
 這個可以匹配用戶名含有“.“的郵箱package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchMail {
public static void main(String[] args) {
}
###中文字符### **[\u4e00-\u9fa5]** ***###用正則表達式取出正則表達式中括號里的數(shù)據(jù) package atest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Aa {
public static void main(String args[]) throws Exception {
// 用正則表達式把字符串中的浮點數(shù)提取出來
// "\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);
}
###匹配IP地址### > 1. 匹配:三個字符一個點 三個字符一個點 三個字符一個點 三個字符 > 2. IP地址<255 > 3. IP地址的數(shù)字不能以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)* ($|(?!\.$)\.) 結(jié)束 或者 不以.結(jié)束的加上.* (?!^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位數(shù),包含0開頭和”—” > 移動電話11位數(shù),以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
轉(zhuǎn)載于:https://www.cnblogs.com/tianjintou/p/4695953.html
總結(jié)
以上是生活随笔為你收集整理的作为程序员之正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商信用卡成功的前兆有哪些?想审核成功这
- 下一篇: 神经网络中的反向传播算法