筆記:正則表達式

来源:http://www.cnblogs.com/li3807/archive/2017/05/14/6853747.html
-Advertisement-
Play Games

正則表達式(regular expression)用於指定字元串的模式,可以在任何需要定位匹配某種特定模式的字元串的情況下使用正則表達式,正則表達式的語法如下: 語法解釋字元c表示字元 c\unnnn,\xnn,\0n,\0nn,\0nnn具有給定十六進位或者十進位值的碼元\t,\n,\r,\f,\... ...


正則表達式(regular expression)用於指定字元串的模式,可以在任何需要定位匹配某種特定模式的字元串的情況下使用正則表達式,正則表達式的語法如下:

語法

解釋

字元

  

c

表示字元 c

\unnnn,\xnn,\0n,\0nn,\0nnn

具有給定十六進位或者十進位值的碼元

\t,\n,\r,\f,\a

控制符:製表符、換行符、回車符、換頁符、警告符

字元類

  

[C1,C2,…]

任何由C1、C2,…表示的字元,其中C1可以表示多個字元,字元範圍C1-C2或者字元類

[^…]

排除匹配,^之後的字元不能匹配

[… && …]

二個字元集的交集

預定義字元類

  

.

除了行終止符之外的所有字元(在 DOTALL 標誌被設置時,則表示所有字元)

\d

一個數字,等價 [0-9]

\D

一個非數字,等價[^0-9]

\s

一個空白字元[\t\n\r\f\x0B]

\S

一個非空白字元

\w

一個詞語字元[a-zA-Z0-9_]

\W

一個非詞語字元

\p{name}

一個命名字元類,命名字元參考命名字元表

\P{name}

一個命名字元類的補集

邊界匹配符

  

^ $

表示輸入的開頭和結尾(或者在多行模式下行的開頭和結尾)

\b

一個詞語邊界

\B

一個非詞語邊界

\A

輸入的開頭

\z

輸入的結尾

\Z

除了行終止符之外的輸入結尾

\G

前一個匹配的結尾

量詞

  

X?

可選的X

X*

X重覆0次或多次

X+

X重覆1次或多次

X{n} X{n,} X{n,m}

X重覆n次,至少n次,在n到m次之間

量詞尾碼

  

在預設(貪婪)匹配轉變為勉強匹配

+

在預設(貪婪)匹配轉變為占用匹配

集合操作

  

XY

在任何X中的字元串,後面跟隨任何Y中的字元串

X|Y

任何X或Y中的字元串

群組

  

(X)

將X做為群組

\n

第 n 個群組的匹配

匹配標誌:

  • CASE_INSENSITIVE:匹配字元時不區分字母的大小寫,預設情況下,這個標誌只考慮US ASCII 字元
  • UNICODE_CASE:當與CASE_INSENSITIVE組合時,用Unicode字母的大小寫來匹配
  • MULTILINE^ $ 匹配行的開頭和結尾,而不是整個輸入的開頭和結尾
  • UNIX_LINUX:在多行模式中匹配 ^ $ 時,只有 '\n' 被識別成行終止符
  • DOTALL:當使用整個標誌時,. 符號匹配所有字元,包含行終止符

示例代碼:

  • 字元串匹配:

            Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+$");

            String testString = "sdlfkjsdkfj342349898LKJKJ";

            Matcher matcher = pattern.matcher(testString);

            System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches());

            System.out.println("-----------------------------------------------------------");

  • 排除匹配:

            pattern = Pattern.compile("[^89]+");

            testString = "1234567890";

            matcher = pattern.matcher(testString);

            System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches());

            testString = "1234567";

            matcher = pattern.matcher(testString);

            System.out.println("testString=" + testString + " pattern=" + pattern.pattern() + " matcher " + matcher.matches()

    +" string "+ matcher.group());

            System.out.println("-----------------------------------------------------------");

  • 群組匹配:

            pattern = Pattern.compile("([a-zA-Z0-9]+):([0-9]+)");

            testString = "a000001:330,a0000002:440,a0000004:445";

            matcher = pattern.matcher(testString);

            while (matcher.find()) {

                    System.out.println("group 0 value " + matcher.group(0) + " start " + matcher.start(0) + " end " + matcher.end(0));

                    System.out.println("group 1 value " + matcher.group(1) + " start " + matcher.start(1) + " end " + matcher.end(1));

                    System.out.println("group 2 value " + matcher.group(2) + " start " + matcher.start(2) + " end " + matcher.end(2));

                    System.out.println("-----------------------------------------------------------");

            }

  • 匹配替換字元串:

            pattern = Pattern.compile("[ab]+");

            testString = "abcdefghijkmul";

            matcher = pattern.matcher(testString);

            String output = matcher.replaceAll("8");

            System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);

            output = matcher.replaceAll(Matcher.quoteReplacement("$"));

            System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);

            output = matcher.replaceAll("\\$");

            System.out.println("pattern " + pattern.pattern() + " input string " + testString + " replace " + output);

            System.out.println("-----------------------------------------------------------");

  • 匹配分隔字元串:

            pattern = Pattern.compile(",");

            testString = "a000001:330,a0000002:440,a0000004:445";

            String[] tokens = pattern.split(testString);

            for (int i = 0; i < tokens.length; i++) {

                    System.out.println("pattern " + pattern.pattern() + " testString " + testString + " split " + tokens[i]);

            }

            System.out.println("-----------------------------------------------------------");

       


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

-Advertisement-
Play Games
更多相關文章
  • 最近在處理wav相關文件,碰見一工具產生的ualw文件不帶header,順手用python給wav格式文件加頭處理,讓普通播放器也能播放。 (原文:http://www.cnblogs.com/ryhan/p/6854348.html) 相關代碼文件下載:files.cnblogs.com/file ...
  • 第二模塊學習: 生成器,迭代器,內置函數 生成器特點:只有在調用時才會生成相應的數據,運行的速度快! 示例: yield 生成器斷點緩存 可賦於變數 .send()可以為yield 傳值、數據 示例: 迭代器:Iterator 可以返回下一個值的迭代對象,就可以稱為迭代器 迭代對象:Iterable ...
  • Python 的列表數據類型包含更多的方法。這裡是所有的列表對象方法: 把一個元素添加到列表的結尾,相當於 a[len(a):] = [x]。 將一個給定列表中的所有元素都添加到另一個列表中,相當於 a[len(a):] = L。 在指定位置插入一個元素。第一個參數是準備插入到其前面的那個元素的索引 ...
  • 題目描述 設有n個正整數(n≤20),將它們聯接成一排,組成一個最大的多位整數。 例如:n=3時,3個整數13,312,343聯接成的最大整數為:34331213 又如:n=4時,4個整數7,13,4,246聯接成的最大整數為:7424613 輸入輸出格式 輸入格式: 第一行,一個正整數n。 第二行 ...
  • 06 圖1:列出連通集. Description: 給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N 1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 Input: 輸入第1行給出2個整數N(0, 10)和E,分別是圖的 ...
  • 題目描述 某小學最近得到了一筆贊助,打算拿出其中一部分為學習成績優秀的前5名學生髮獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學 排在前面,這樣,每個學生的排序是唯 ...
  • 輸入一句英文句子,只有英文字(a-z, A-Z)、每個字之間僅以一個空格分格,前後沒有空格。 返回的是把每一個字的字母順序倒轉寫,但字的順序和字母的大小寫位置則保持不変 ...
  • 題目描述 一共有n(n≤20000)個人(以1--n編號)向佳佳要照片,而佳佳只能把照片給其中的k個人。佳佳按照與他們的關係好壞的程度給每個人賦予了一個初始權值W[i]。然後將初始權值從大到小進行排序,每人就有了一個序號D[i](取值同樣是1--n)。按照這個序號對10取模的值將這些人分為10類。也 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...