作為程序員之正則表達式


正則表達式#

基礎語法##

標准字符集合

\D 和[^\d]意思一樣,就是與 \d 相反

REG 意義
\ddigital 表示 0 到 9 之間任意的一個數字
\wworld 表示任意一個字母或數字或下划線,不包含¥$%等
\sspace 表示包括空格、制表符、換行符等空白字符中任意一個
. 可以匹配任意一個字符

自定義的字符集合###

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,}

多行、單行模式

  1. 忽略大小寫:ignorecase
  2. 單行模式:single line 整個串作為一個模板串
  3. 多行模式: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) 反向預搜索,反向預搜索,判斷當前位置左側是否能夠匹配指定表達式

例子##

匹配郵箱###


要考慮的問題:

  1. 把@前面的給匹配了:(\w+)
  2. 匹配“.”:. (因為“.”表示任意字符,所以要轉義一下才能匹配到“.”)
  3. 把@后面的域名給匹配了,要考慮多層域名的匹配
  4. 用戶名和域名中的大小寫
  5. 用戶名中含有 “.”
  6. 並不允許用戶名中出現”-“

第一版
沒能匹配到用戶名中有 ”.“的郵箱
(\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地址###

  1. 匹配:三個字符一個點 三個字符一個點 三個字符一個點 三個字符
  2. IP地址<255
  3. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM