Java正則表達式教程及示例

當我開始使用Java時,正則表達式對我來說是一場噩夢。 本教程旨在幫助您掌握Java正則表達式,并讓我定期返回以刷新我的正則表達式學習。

什么是正則表達式?

正則表達式定義字符串的模式。 正則表達式可用于搜索,編輯或處理文本。 正則表達式不是特定于語言的,但是每種語言的正則表達式略有不同。 Java正則表達式與Perl最相似。

Java正則表達式類存在于java.util.regex軟件包中,該軟件包包含三個類: PatternMatcherPatternSyntaxException

1.模式對象是正則表達式的編譯版本。 它沒有任何公共構造函數,我們使用其公共靜態方法compile通過傳遞正則表達式參數來創建模式對象。

2. Matcher是將輸入的字符串模式與創建的模式對象進行匹配的正則表達式引擎對象。 此類沒有任何公共構造函數,并且我們使用模式對象匹配器方法(將輸入String作為參數)來獲得Matcher對象。 然后,我們使用matchs方法根據輸入的String是否匹配正則表達式模式返回布爾結果。

3.如果正則表達式語法不正確,則會引發PatternSyntaxException。

讓我們通過一個簡單的示例查看所有這些類的作用:

package com.journaldev.util;import java.util.regex.*;public class PatternExample {public static void main(String[] args) {Pattern pattern = Pattern.compile('.xx.');Matcher matcher = pattern.matcher('MxxY');System.out.println('Input String matches regex - '+matcher.matches());// bad regular expressionpattern = Pattern.compile('*xx*');}}

上面程序的輸出是:

Input String matches regex - true
Exception in thread 'main' java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^at java.util.regex.Pattern.error(Pattern.java:1924)at java.util.regex.Pattern.sequence(Pattern.java:2090)at java.util.regex.Pattern.expr(Pattern.java:1964)at java.util.regex.Pattern.compile(Pattern.java:1665)at java.util.regex.Pattern.(Pattern.java:1337)at java.util.regex.Pattern.compile(Pattern.java:1022)at com.journaldev.util.PatternExample.main(PatternExample.java:13)

由于正則表達式圍繞String展開,因此Java 1.4中對String類進行了擴展,以提供進行模式匹配的match方法。 在內部,它使用Pattern和Matcher類進行處理,但是顯然,它減少了代碼行。

模式類還包含matches方法,該方法以正則表達式和輸入String作為參數,并在匹配它們后返回布爾結果。

因此,以下代碼可以很好地將輸入String與正則表達式匹配。

String str = 'bbb';System.out.println('Using String matches method: '+str.matches('.bb'));System.out.println('Using Pattern matches method: '+Pattern.matches('.bb', str));

因此,如果您只需要檢查輸入的String是否與模式匹配,則應使用簡單的String Match方法來節省時間。 僅在需要操縱輸入String或需要重用模式時,才使用Pattern和Matches類。

請注意,由正則表達式定義的模式從左到右應用于字符串,并且一旦在匹配項中使用了源字符,就無法重用它。

例如,正則表達式“ 121”將匹配“ 31212142121”的次數是“ _121____121”的兩倍。

正則表達式常見的匹配符號

正則表達式 描述
匹配任何單個符號,包括所有內容 (“ ..”,“ a%”)– true(“ ..”,“。a”)– true

(“ ..”,“ a”)–否

^ xxx 在行首匹配xxx正則表達式 (“ ^ ac”,“ abcd”)– true(“ ^ a”,“ a”)– true

(“ ^ a”,“ ac”)–否

xxx $ 在行尾匹配正則表達式xxx (“ .cd $”,“ abcd”)–真(“ a $”,“ a”)–真

(“ a $”,“ aca”)–否

[abc] 可以匹配字母a,b或c。 []被稱為字符類。 (“ ^ [abc] d。”,“ ad9”)–正確(“ [ab] .d $”,“壞”)–正確

(“ [ab] x”,“ cx”)–否

[abc] [12] 可以匹配a,b或c,然后匹配1或2 (“ [ab] [12]。”,“ a2#”)– true(“ [ab] .. [12]”,“ acd2”)– true

(“ [ab] [12]”,“ c2”)–否

[^ abc] 當^是[]中的第一個字符時,它會否定模式,匹配除a,b或c之外的任何其他字符 (“ [[^ ab] [^ 12]。”,“ c3#”)–真(“ [[^ ab] .. [^ 12]”,“ xcd3”)–真

(“ [^ ab] [^ 12]”,“ c2”)–否

[a-e1-8] 匹配范圍從a到e或1到8 (“ [a-e1-3]”,“ d#”)–真(“ [a-e1-3]”,“ 2”)-真

(“ [a-e1-3]”,“ f2”)–否

xx | yy 匹配正則表達式xx或yy (“ x。| y”,“ xa”)– true(“ x。| y”,“ y”)

(“ x。| y”,“ yz”)–否


Java正則表達式元字符

正則表達式 描述
\ d 任何數字,少于[0-9]
\ D 任何非數字,是[^ 0-9]的縮寫
\ s 任何空格字符,是[\ t \ n \ x0B \ f \ r]的縮寫
\ S 任何非空白字符,是[^ \ s]的縮寫
\ w 任何文字字符,是[a-zA-Z_0-9]的縮寫
\ W 任何非單詞字符,是[^ \ w]的縮寫
\ b 單詞邊界
\ B 非單詞邊界

在正則表達式中有兩種方法可以將元字符用作普通字符。

  1. 在元字符之前加一個反斜杠(\)。
  2. 保持元字符在\ Q(以引號開頭)和\ E(以引號結尾)之內。


正則表達式量詞

量詞指定要匹配的字符的出現次數。

正則表達式 描述
X? x發生一次或根本不發生
X* X出現零次或多次
X + X發生一次或多次
X {n} X正好發生n次
X {n,} X出現n次或更多次
X {n,m} X發生至少n次但不超過m次

量詞也可以與字符類和捕獲組一起使用。

例如,[abc] +表示a,b或c一次或多次。

(abc)+表示“ abc”組再出現一次。 我們現在將討論捕獲組

正則表達式捕獲組

捕獲組用于將多個字符視為一個單元。 您可以使用()創建一個組。 輸入String與捕獲組匹配的部分被保存到內存中,可以使用Backreference進行調用。

您可以使用matcher.groupCount方法找出正則表達式模式中的捕獲組數。 例如在((a)(bc))中包含3個捕獲組; ((a)(bc)),(a)和(bc)。

您可以在正則表達式中使用反引號 (\),然后再調用要調用的組數。

捕獲組和反向引用可能會造成混淆,因此讓我們通過一個示例來理解它。

System.out.println(Pattern.matches('(\\w\\d)\\1', 'a2a2')); //trueSystem.out.println(Pattern.matches('(\\w\\d)\\1', 'a2b2')); //falseSystem.out.println(Pattern.matches('(AB)(B\\d)\\2\\1', 'ABB2B2AB')); //trueSystem.out.println(Pattern.matches('(AB)(B\\d)\\2\\1', 'ABB2B3AB')); //false

在第一個示例中,在運行時,第一個捕獲組是(\ w \ d),當與輸入字符串“ a2a2”匹配并保存在內存中時,其計算結果為“ a2”。 因此\ 1指的是“ a2”,因此它返回true。 由于相同的原因,第二條語句打印為false。
嘗試自己了解語句3和4的這種情況。

現在,我們將研究一些重要的Pattern和Matcher類方法。

我們可以創建帶有標志的Pattern對象。 例如模式。 CASE_INSENSITIVE啟用不區分大小寫的匹配。

模式類還提供了類似于String類split()方法的split(String)
模式類toString()方法返回從中編譯此模式的正則表達式String。

Matcher類具有start()end()索引方法,這些方法精確顯示在輸入字符串中找到匹配項的位置。

Matcher類還提供String操作方法replaceAll(String替換)replaceFirst(String替換)

現在,我們將通過一個簡單的java類看到這些常用功能:

package com.journaldev.util;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexExamples {public static void main(String[] args) {// using pattern with flagsPattern pattern = Pattern.compile('ab', Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher('ABcabdAb');// using Matcher find(), group(), start() and end() methodswhile (matcher.find()) {System.out.println('Found the text \'' + matcher.group()+ '\' starting at ' + matcher.start()+ ' index and ending at index ' + matcher.end());}// using Pattern split() methodpattern = Pattern.compile('\\W');String[] words = pattern.split('one@two#three:four$five');for (String s : words) {System.out.println('Split using Pattern.split(): ' + s);}// using Matcher.replaceFirst() and replaceAll() methodspattern = Pattern.compile('1*2');matcher = pattern.matcher('11234512678');System.out.println('Using replaceAll: ' + matcher.replaceAll('_'));System.out.println('Using replaceFirst: ' + matcher.replaceFirst('_'));}}

上面程序的輸出是:

Found the text 'AB' starting at 0 index and ending at index 2
Found the text 'ab' starting at 3 index and ending at index 5
Found the text 'Ab' starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678

正則表達式是Java面試問題的領域之一,在接下來的幾篇文章中,我將提供一些實際示例。

參考: 開發人員食譜博客上的JCG合作伙伴 Pankaj Kumar的Java正則表達式示例教程 。

翻譯自: https://www.javacodegeeks.com/2012/11/java-regular-expression-tutorial-with-examples.html

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

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

相關文章

Vue2.0 --- vue-cli腳手架中全局引入JQ

第一步:安裝jQuery npm/cmpn方式安裝(默認安裝1.7.X版本的JQ) npm/cnpm install jQuery 如果想安裝更高版本的JQ那么可以選擇在package.json文件下面這個位置添加代碼斷(當前圖片安裝的是2.2.3版本,如果想安裝更高或者其他可以更改版本號&…

python筆記全_Python筆記

一、數據結構和序列1.1、元組:有一種固定長度,不可修改的python對象序列tup 1,2,3 tup : (1,2,3)tup tuple([4,0,2]) tup : (4,0,2)tup[0] 4元組添加元素:tup (["foo",[1,2],True])tup[1].append(3)tup : ("foo",[1,…

java 分布式編譯_linux分布式編譯distcc和ccache的部署

unset LANGUAGEexport LANG"en"cd /home/kingsoftmkdir distcccd distccrpm包用:rpm -ivh ...bz2包用:tar -xvf ...進入distcc解壓后的目錄./configure && make && make installmkdir /usr/lib/distccmkdir /usr/lib/distcc/b…

Unity——用UnityEditor拷貝FBX中的AnimationClip

最近有個新需求,要用代碼添加動畫的事件,但是Unity不能直接修改FBX中的AnimationClip 在Animation窗口中可以看到,AnimationClip是Read-Only狀態,用代碼修改這個AnimationClip也是不會生效的,包括用代碼添加事件 解決方…

sql 分頁存儲過程

ALTER procedure [dbo].[fenye]pagesize int, --每頁顯示數量pageCurrent int, --當前頁tablename varchar(20), --表名field varchar(20), --顯示的列名(eg: id,name)where varchar(20), --篩選條件 (eg: name not null)orderBy varchar(20), --排序的列名(eg: id …

使用Hadoop計算共現矩陣

這篇文章繼續我們在MapReduce的數據密集型文本處理一書中實現MapReduce算法的系列。 這次,我們將從文本語料庫創建單詞共現矩陣。 本系列以前的文章是: 使用MapReduce進行數據密集型文本處理 使用MapReduce進行數據密集型文本處理-本地聚合第二部分 共…

HTML5 拖放、交換位置

設置元素為可拖放 draggable 屬性設置為 true: <img draggable"true" /> 拖動什么 - ondragstart 和 setData() dataTransfer.setData() 方法設置被拖數據的數據類型和值: function drag(e) { e.dataTransfer.setData("text/html", value); }注&…

java 工作6年 面試_為什么不想搞Java了,6年經驗去面試5分鐘結束,現在Java面試為何這么難...

3、Java并發什么是可重入鎖、樂觀鎖、悲觀鎖、公平鎖、非公平鎖、獨占鎖、共享鎖&#xff1f;講講ThreadLocal 的實現原理&#xff1f;ThreadLocal 作為變量的線程隔離方式&#xff0c;其內部是如何做的&#xff1f;說說InheritableThreadLocal 的實現原理&#xff1f;并發包中…

mvc如何嵌套第三方頁面_長文觀點丨為什么我不再使用MVC框架?

原創&#xff1a; 張衛濱 譯 Jean-Jacques Dubray是一名資深工程師&#xff0c;他最近引入了一個新的模式&#xff1a;狀態-行為-模(State-Action-Model&#xff0c;SAM)。SAM是一個函數式反應型的編程模式&#xff0c;它致力于簡化數據Model和View之間的交互。它究竟有何優點值…

JSON和XML的區別

轉載于:https://www.cnblogs.com/mr-wuxiansheng/p/6974239.html

屏幕適配

rem是什么&#xff1f; rem&#xff08;font size of the root element&#xff09;是指相對于根元素的字體大小的單位。簡單的說它就是一個相對單位。看到rem大家一定會想起em單位&#xff0c;em&#xff08;font size of the element&#xff09;是指相對于父元素的字體大小…

【存儲過程】MySQL存儲過程/存儲過程與自定義函數的區別

---------------------------存儲過程-------------------- 語法: 創建存儲過程: CREATE [definer {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristics..] routime_body 其中: proc_parameter : [IN|OUT|INOUT] parameter_…

Java死鎖故障排除和解決

JavaOne年度會議的一大優點是&#xff0c;主題專家介紹了幾個技術和故障排除實驗室。 其中的一個實驗室今年特別吸引了我的注意力&#xff1a;“ HOL6500-查找和解決Java死鎖 ”&#xff0c;由Java冠軍Heinz Kabutz提出 。 這是我在該主題上看到的最好的演示之一。 我建議您自己…

java.util.scanner sc_關于Java的Scanner的問題,菜鳥求各大神解答

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓package leetcode;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.…

3. HTML中的容器標簽

什么是容器標簽&#xff1f;在HTML開發中我們常常會使用一類標簽作為容器放置一些內容&#xff0c;我們把這類標簽稱之為容器標簽&#xff0c;可以作為容器標簽的包括列表標簽、表格標簽、框架標簽、布局標簽&#xff0c;在這里我們就來總結下這些內容。 列表標簽 1 <!-- 無…

python自帶sqlite庫_Python標準庫之sqlite3使用實例

Python自帶一個輕量級的關系型數據庫SQLite。這一數據庫使用SQL語言。SQLite作為后端數據庫&#xff0c;可以搭配Python建網站&#xff0c;或者制作有數據存儲需求的工具。SQLite還在其它領域有廣泛的應用&#xff0c;比如HTML5和移動端。Python標準庫中的sqlite3提供該數據庫的…

GitHub上Java的Bloom Bloom實現

布隆過濾器是集數據結構的一種 。 對于那些不了解的對象&#xff0c;“設置數據結構”僅包含一個主要方法。 它僅用于確定特定元素是否包含在一組元素中。 大多數數據結構&#xff08;例如Hash Map &#xff0c; Linked List或Array &#xff09;都可以相當輕松地創建此函數。 …

Hibernate(十五):QBC檢索、本地SQL檢索和HQL刪除

QBC檢索QBC查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象&#xff0c;這種API封裝了SQL語句的動態拼裝&#xff0c;對查詢提供了更加面向對象的功能接口。 1&#xff09;通過Critera實現具有條件的查詢 1 Test2 public void testCriteria00() {3 …

java 創建連接池失敗_java-Presto JDBC連接池創建錯誤“不支持禁用...

我正在嘗試使用Spring-JDBC連接到Presto,并且我正在使用Hikari CP作為數據源.這是我的配置&#xff1a;Beanpublic DataSource myDataSource() {HikariDataSource hikariDataSource new HikariDataSource();hikariDataSource.setDriverClassName("com.facebook.presto.jd…

ni軟件管理器_NI 技術支持丨我的 NI 硬件設備不能被識別,怎么辦?Windows

這篇指南可以幫助您解決在您的 Windows 系統上無法識別您的 NI 硬件有關的問題。癥狀包括以下幾種情況&#xff1a;連接至 USB 端口時&#xff0c;硬件上的 LED 燈不亮/不閃爍。連接至 USB 后已連接設備的 LED 燈持續閃爍。僅限音頻接口&#xff1a;該設備在音頻應用程序或 Win…