作為程序員之正則表達式

目錄

  • 正則表達式
    • 基礎語法
      • 標準字符集合
      • 自定義的字符集合
      • 多行、單行模式
    • 高級語法
      • 選擇符和分組
      • 反向引用
      • 預搜索/零寬斷言
    • 例子
      • 匹配郵箱

正則表達式

基礎語法

標準字符集合

\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)| 反向預搜索,反向預搜索,判斷當前位置左側是否能夠匹配指定表達式|

例子

匹配郵箱

brdlianyao_org.gif
23170831-5d9e8c439750496fb2ffec7616fecb7b.jpg

要考慮的問題:

  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

最終版


![](https://images0.cnblogs.com/blog/582013/201312/23170854-ccd9c8305e1d43e998a0240d67cdc1f2.jpg)
這個可以匹配用戶名含有“.“的郵箱

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()則為truewhile(m.find()){//每一組匹配到的字符都被放到了group里System.out.println(m.group(0));i++;}System.out.println(i);
}

}


###中文字符###
**[\u4e00-\u9fa5]**
***###用正則表達式取出正則表達式中括號里的數據
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901151130888-1768887603.png)

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})
```
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901221837544-1968355426.png)

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
022028425952741.png

轉載于:https://www.cnblogs.com/tianjintou/p/4695953.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript 的dateObj.getTime() 在為C#的獲取方式

publicstringGetTime() { Int64 retval 0; DateTime st newDateTime(1970, 1, 1); TimeSpan t (DateTime.Now.ToUniversalTime() -st); retval (Int64)(t.TotalMilliseconds 0.5); returnretval.ToString(); } 在Net中的實際測試代碼 MSScriptControl.Scri…

學習筆記(34):Python網絡編程并發編程-異步調用與回調機制

立即學習:https://edu.csdn.net/course/play/24458/296452?utm_sourceblogtoedu 1.知識點&#xff1a;&#xff08;詳細見代碼注釋&#xff09; 1&#xff09;同步調用&#xff1a; res1 pool.submit(ju,john1).result() 2&#xff09;異步調用 pool.submit(ju,john1) 3…

c和c++的結構體使用

一&#xff1a;結構體其實有兩種初始化方式 1、直接把多有的變量在其內部通過形參傳入到結構體中&#xff0c;結構體定義在程序的最開頭是個全局變量&#xff1b;這個時候參數已經傳入進來&#xff0c;在本文件中都可以直接使用該結構體的所有成員變量 2、先定義&#xff0c;…

python第三方庫安裝的各種方法(全網最全,最簡單易懂)

使用鏡像&#xff1a; pip install virtualenv -i https://pypi.douban.com/simple 國內源&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple module_name 或 pip install -i https://pypi.douban.com/simple module_name 國內的鏡像源來加速 pip inst…

Jmeter服務器監控插件使用

Jmeter服務器監控插件使用 Jmeter-Plugins支持CPU、Memory、Swap、Disk和Network的監控&#xff0c;在測試過程中更加方便進行結果收集和統計分析。 一、準備工作&#xff1a; 1、下載Jmeter-Plugins插件&#xff0c;下載Server端ServerAgent插件&#xff1b; 2、解壓Jmeter-Pl…

以后遇見 visual studio的調試bug出錯,直接查詢錯誤代碼;高效解決調試問題

1、例如遇到&#xff1a; 嚴重性 代碼 說明 項目 文件 行 錯誤 LNK2005 "void __cdecl readFileList(class std::basic_string<char,struct std::char_traits<char>, class std::allocator<char> >,class std::vector<class s…

數據庫導入導出命令

Oracle數據導入導出imp/exp 功能&#xff1a;Oracle數據導入導出imp/exp就相當與oracle數據還原與備份。 大多情況都可以用Oracle數據導入導出完成數據的備份和還原&#xff08;不會造成數據的丟失&#xff09;。 Oracle有個好處&#xff0c;雖然你的電腦不是服務器&#xff0c…

CCNA系列課程(4)交換技術

第四節課 交換技術杜飛2009-06-28咱們今天來看一下局域網交換技術&#xff0c;也稱為層2交換技術&#xff0c;內容主要包括層2交換的工作原理、網絡環路、如何利用Spanning-Tree Protocol 來解決網絡環路、VLAN及VTP技術&#xff0c;閑話少說&#xff0c;書歸正傳。我們在…

python中yield的用法詳解——最簡單,最清晰的解釋(轉載)

首先&#xff0c;如果你還沒有對yield有個初步分認識&#xff0c;那么你先把yield看做“return”&#xff0c;這個是直觀的&#xff0c;它首先是個return&#xff0c;普通的return是什么意思&#xff0c;就是在程序中返回某個值&#xff0c;返回之后程序就不再往下運行了。看做…

extern 全局變量在不同的文件使用方法(static)

例如&#xff1a;1.c int k6&#xff1b; 想要在2.c中調用1.c的k 則在2.c中用extern k 聲明一下就可以使用了&#xff1b; int c3; ck; 但是如果1.c中是這樣定義的 static int k6; 想要在2.c中使用k時不允許的&#xff0c;static只能在本文件中使用&#xff0c;外部文件…

python學習之路基礎篇(第八篇)

一、作業&#xff08;對象的封裝&#xff09;     要點分析 1.封裝&#xff0c;對象中嵌套對象 2.pickle,load,切記&#xff0c;一定要先導入相關的類二、上節內容回顧和補充      面向對象基本知識&#xff1a; 1.類和對象的…

Ubuntu實現樹莓派交叉編譯

一、交叉編譯 在一個平臺上生成另一個平臺上的可執行代碼。為什么要大費周折的進行交叉編譯呢&#xff1f;一句話&#xff1a;不得已而為之。有時是因為目的平臺上不允許或不能夠安裝所需要的編譯器&#xff0c;而又需要這個編譯器的某些特征&#xff1b;有時是因為目的平臺上的…

python常用的第三方庫總結

通用 urllib -網絡庫(stdlib)。requests -網絡庫。grab – 網絡庫&#xff08;基于pycurl&#xff09;。pycurl – 網絡庫&#xff08;綁定libcurl&#xff09;。urllib3 – Python HTTP庫&#xff0c;安全連接池、支持文件post、可用性高。httplib2 – 網絡庫。RoboBrowser –…

ubuntu系統安裝vscode教程

方法一&#xff1a; 依次輸入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示輸入a即可 方法二&#xff1a; 在windows系統下載安裝包&#xff0c…

pydebugger

定義結構體from ctypes import *WORD c_ushort DWORD c_ulong LPBYTE POINTER(c_ubyte) LPTSTR POINTER(c_char) HANDLE c_void_pDEBUG_PROCESS 0x00000001 CREATE_NEW_CONSOLE 0x00000010class STARTUPINFO(Structure):_fields_ [("cb", DWORD),("lpR…

Vue2 源碼漫游(一)

Vue2 源碼漫游&#xff08;一&#xff09; 描述&#xff1a; Vue框架中的基本原理可能大家都基本了解了&#xff0c;但是還沒有漫游一下源碼。 所以&#xff0c;覺得還是有必要跑一下。 由于是代碼漫游&#xff0c;所以大部分為關鍵性代碼&#xff0c;以主線路和主要分支的代碼…

神經網絡中的反向傳播算法

神經網絡中的方向傳播算法講得復雜難懂。簡單地說明它的原理&#xff1a; 神經網絡&#xff1a;輸入層&#xff0c;隱藏層&#xff0c;輸出層。根據線性關系&#xff0c;激活函數&#xff0c;并最終根據監督學習寫出誤差表達式。此時&#xff0c;誤差函數可寫成&#xff0c;那么…

有限元筆記02:第三章

1.局部坐標到全局坐標變換 2.

bug__android studio 出現布局文件不提示,且點擊代碼不能跟蹤代碼

1&#xff0c;點擊布局文件&#xff0c;出現 Cannot find declaration to go to ? 且 點擊代碼不能跟蹤代碼&#xff1f; 把 項目的build.gradle 中的 compileSdkVersion 23 版本設置最高。 apply plugin: com.android.applicationandroid { compileSdkVersion 23 b…

Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 錯誤解決

This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 錯誤解決 這次國慶節回來后的測試中&#xff0c;在一個Mysql表達式中使用嵌套查詢&#xff0c;出現了這個錯誤。原因是內層select語句帶有limit子句。 在網上查了下&#xff0c;有文章指出&#xff…