正則表達式個人總結(二):正則表達式語法的深入理解第二部分

来源:http://www.cnblogs.com/hanhanhan/archive/2016/08/20/5790806.html
-Advertisement-
Play Games

4.選擇與分組 (1).分組 字元組[]:表示匹配若幹個字元之一 字元組可以淺顯的理解為一些字元的組合,字元組與普通字元的區別在於:abc普通字元表示匹配a接下來b接下來c而字元組[abc]表示在同一位置匹配a或者b或者c;由於字元組本身的含義也決定了可以將這個字元組看成是一個普通的特殊字元。 普通 ...


4.選擇與分組

(1).分組

字元組[]:表示匹配若幹個字元之一

字元組可以淺顯的理解為一些字元的組合,字元組與普通字元的區別在於:abc普通字元表示匹配a接下來b接下來c而字元組[abc]表示在同一位置匹配a或者b或者c;由於字元組本身的含義也決定了可以將這個字元組看成是一個普通的特殊字元。

普通性:普通是因為它也表示在一個位置上匹配一個字元對單個字元的操作在其上面也是可以起作用的;如:[a-z]{6};

特殊性:特殊是因為,1.其他字元在其內外的含義可能不同如:-,.,^等,2.在同一個位置可以有多中選擇,但這種選擇也只是限於一個字元;

各個字元在字元組內外的區別:

-在字元組內部,表示一個範圍;在字元組外僅僅表示是一個字元;

例子:

-在字元組

<script type="text/javascript">
  var str = '2016-8-20';
  var reg = /16-8/g;
  console.log(str.match(reg));  //16-8
  </script>

-在字元組

<script type="text/javascript">
  var str = '2016-8-20';
  reg = /1[6-8]/g;
  console.log(str.match(reg));  //16  
</script>

 

-在字元組外是一個普通字元只表示-這個字元本身,所以匹配的是1接下來是6接下來是-接下來是8的這段字元串;所以是16-8

-在字元組內表示的是一個範圍,所以匹配的是1接下來是6到8之間的任意數字的字元所以是16;

 

.:在字元組內部表示一個點;在字元組外部表示任意字元(查找單個字元,除了換行和行結束符)。

.在字元組

<script type="text/javascript">
	var str = '2016-8-20';
    var reg = /6.8/g;
    console.log(str.match(reg));  //6-8
  </script>

 

.在字元組

<script type="text/javascript">
  var str = '2016-8-20';
  var reg = /6[.]8/g;
  console.log(str.match(reg));  //null
  </script>

 

.在字元組外表示任意字元;所以匹配的是6接下來是任意一個字元接下來是8的一個字元串,所以匹配到的是6-8;

.在字元組內只是一個普通字元表示它本身;所以匹配的是6接下來是.接下來是8的一個字元串由於未匹配到所以為null;

 

對於字元組還可以分為匹配型字元組和排除型字元組主要是因為^的含義的變化

^: 脫字元;

例子:

^在字元組

  <script type="text/javascript">
   var str = 'han';
   var reg = /^ha/g;
  console.log(str.match(reg)); //ha
  </script>

 

^在字元組

 <script type="text/javascript">
   var str = 'han';
   var reg = /[^0-9]/g;
  console.log(str.match(reg)); // h,a,n
  </script>

 

脫字元在[]外部是一個錨點,表示匹配以某某字元開頭的字元或者字元串,在[]中有除了的意思

 

註意:[^a]表示匹配一個位置不等於a的字元,不要去理解成這個位置不是a就能匹配,後者的理解可以匹配一個空行,註意這個區別

例子:

  <script type="text/javascript">
	var str = 'han';
    var reg = /n[^q]/g;
  console.log(str.match(reg));  //null
  </script>

 

註意:這個例子在n之後沒有任何字元,所以匹配的結果為空,如果按照上述的第二種理解可能就會認為匹配結果是:n

 

[]中不管有多少字元,在同一個位置只會匹配到其中的任意一個,如果說我要在一個位置上匹配一個字元串那又該如何呢?

 

(2).選擇

此時可以用()加|這個組合,|在正則表達式中是或者的意思,而()在正則表達式中劃分一個範圍;單獨的()使用時沒有意義的,只有當它和其他量詞共同使用才會體現出它的作用(先說下淺顯的例子,貪婪匹配和非貪婪匹配再單獨去說,這裡先不作說明);

例子:

  <script type="text/javascript">
  var str = '2016-8-20';
  var reg = /(16-8)/g;
  console.log(str.match(reg));  //16-8
  </script>

 

<script type="text/javascript">
	var str = '2016-8-20';
    var reg = /16-8/g;
  console.log(str.match(reg));  //16-8
  </script>

 

這個例子有沒有括弧都一樣都表示匹配16-8這個字元串

當()和|一起使用則是一種多選結構,可以匹配任意子表達式()表示的是一個範圍;|表示的是一個選擇方向

例子:

  <script type="text/javascript">
  var str = 'greygray';
  var reg = /gr[ea]y/g;
  console.log(str.match(reg)); // grey,gray
  reg = /gr(e|a)y/g;
  console.log(str.match(reg));  //grey,gray
  </script>

 以上這兩種匹配的結果都是grey, gray也就是說(|)的分支選擇結構在一定程度上是可以和[]進行互相替代

 

例子:

  <script type="text/javascript">
	var str = 'greygray';
   var reg = /gre|ay|yg/g;
  console.log(str.match(reg)); //gre,yg,ay
  </script>

 輸出結果:gre,yg,ay

括弧的添加與否對結果的影響很大如:

^hello | world | hi :匹配的是 ^hello  或者 world 或者  hi

^(hello | world | hi):.匹配的起始行是 ^hello 或者 ^world 或者  ^ hi

 

註意:多選結構雖然有時候可以用字元組來表示,他倆之間可以互相表示,但是一個字元組只能匹配目標文本中的單個字元,而每個多選結構自身都可能是完整的正則,都可以匹配任意長度的文本

 

在正則表達式中需要註意的幾點:

1.在正則表達式中,空格字元也被視作一個規則字元;

2.-;.;*等在[]內和[]外的含義並不相同註意區別;註意元字元在字元組內外的區別;

3.當對幾個字元添加[]之後該字元串就被視作一個字元組,而對單個字元操作的?*等也可以對其使用,量詞之間的混合使用和量詞與分組選擇之間的混合會有一個貪婪和非貪婪匹配的概念,對此會單獨拿出總結;

4.分支結構和字元組的區別;分支可以匹配任意長度的文本;字元組只能匹配一個字元;

5.註意一些概念的理解:比如:[^x]表示‘匹配一個不等於x的字元’而不是’只有當這個位置不是x才能匹配’;[^x]後面的概念可以匹配一個空行在比如{x,y},?,*的理解;

6.在匹配中決定匹配是否成功的是{x,y}中的x,x對匹配成功與否起關鍵作用。

以上內容純屬個人總結,如有疑問請私信,如需轉載請註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天剛學了java script,記錄下學習新知識的點滴。以下是操作步驟。 1、新建一個文檔(用NotePad軟體,為了使得在瀏覽器中打開不是亂碼,在軟體的文件出找到編碼,將其修改為UTF-8編碼。或者點擊谷歌瀏覽器中的右上角的三條杠,選擇更多工具->編碼->UTF-8),將其重命名(例:第一個ja ...
  • 1、兄弟選擇器:①相鄰兄弟選擇器:元素的後一個兄弟元素,選擇器1+選擇器2;②通用兄弟選擇器:元素後的所有兄弟元素,選擇器1~選擇器2; 2、屬性選擇器:attr表示屬性名稱,elem表示元素名;①[attr]:頁面中所有帶有attr屬性的元素;②elem[attr]:頁面中所有帶attr屬性的el ...
  • 模板描述:html5 canvas首屏自適應背景動畫迴圈效果代碼 由於動態圖太大,怕以後伺服器受不了,所以現在都改為靜態圖了,大家點擊演示地址一樣的,希望大家喜歡,你們的支持就是小海的動力!! ...
  • 1、字體屬性:①字體格式:font-family:取值:“microsoft yahei”/Arial……;②字體大小:font-size:取值:pt/px;③字體加粗:font-weight:取值:normal(預設值)/bold(粗體,hn,b,strong的預設值)/400-900;④字體樣式 ...
  • 一、html概述 htyper text markup language 即超文本標記語言 超文本: 就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素。 標記語言: 標記(標簽)構成的語言. 網頁==HTML文檔,由瀏覽器解析,用來展示的 靜態網頁:靜態的資源,如xxx.html 動態網頁 ...
  • 一、什麼是JavaScrip JavaScript是一種動態類型、弱類型、基於原型的客戶端腳本語言。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,在HTML網頁上使用,用來給HTML網頁增加動態功能。 動態: 在運行時確定數據類型,通常變數的類型取決於值的類型 ...
  • html、javascript會涉及到三個解析器,html解析器、xml解析器、javascript解析器。那麼好了,問題來了,以上代碼經常混編在一起,各自有各自的規則,終究會有衝突的,如下就是衝突。 根據W3C XHTML 1.0的規定:在XHTML中,因為<和&這兩個符號有特殊意義(小於號用於標 ...
  • 網站logo既要考慮seo又需要用圖片代替網站名字,所有H1標簽帶來的權重還是需要使用 有些人喜歡直接把<H1></H1>標簽直接hidden掉,個人喜歡使用css Text-indent還是放到屏幕外 .logo h1 { overflow: hidden; position: absolute; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...