欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請碼778899分享:java 正則表達(dá)式的使用

柚子快報(bào)邀請碼778899分享:java 正則表達(dá)式的使用

http://yzkb.51969.com/

文章目錄

簡介什么是正則表達(dá)式正則表達(dá)式在Java中的應(yīng)用

Java正則表達(dá)式基礎(chǔ)常用的正則表達(dá)式符號和規(guī)則Java中的正則表達(dá)式類:Pattern和Matcher

Java正則表達(dá)式實(shí)例字符串匹配字符串搜索字符串替換字符串分割驗(yàn)證電子郵件地址驗(yàn)證手機(jī)號碼(假設(shè)我們只接受10位數(shù)字)驗(yàn)證URL驗(yàn)證IP地址提取字符串中的數(shù)字驗(yàn)證是否是數(shù)字驗(yàn)證是否是字母驗(yàn)證是否是日期(格式:yyyy-mm-dd)驗(yàn)證密碼強(qiáng)度(至少8個(gè)字符,包含大寫字母,小寫字母和數(shù)字)

Java正則表達(dá)式的實(shí)現(xiàn)Pattern類的實(shí)現(xiàn)Matcher類的實(shí)現(xiàn)

Java正則表達(dá)式的性能優(yōu)化預(yù)編譯正則表達(dá)式使用非捕獲組

簡介

什么是正則表達(dá)式

正則表達(dá)式(Regular Expression,通常簡稱為regex,regexp或RE),是一種強(qiáng)大的文本處理工具,它是一種用于匹配字符串中字符組合的模式。正則表達(dá)式可以用來檢查一個(gè)字符串是否含有某種子串、將匹配的子串替換或從某個(gè)字符串中取出符合某個(gè)條件的子串等。

例如,正則表達(dá)式 a.b 可以匹配 “acb”、“aeb”、“a1b” 等,. 是一個(gè)特殊字符,代表任何字符(除了換行符)。

String regex = "a.b";

String str = "acb";

boolean matches = str.matches(regex); // returns true

正則表達(dá)式在Java中的應(yīng)用

在Java中,正則表達(dá)式主要通過 java.util.regex 包中的兩個(gè)類 Pattern 和 Matcher 來使用。Pattern 類用于編譯正則表達(dá)式,而 Matcher 類用于執(zhí)行通過 Pattern 類編譯的正則表達(dá)式在字符序列上的操作。

正則表達(dá)式在Java中的應(yīng)用廣泛,包括但不限于:

驗(yàn)證輸入:例如,檢查用戶輸入的電子郵件地址或電話號碼是否有效。搜索文本:例如,搜索日志文件中的特定錯(cuò)誤模式。文本替換:例如,將文本文件中的所有 “colour” 替換為 “color”。數(shù)據(jù)提取:例如,從文本文件中提取所有電子郵件地址。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

Pattern pattern = Pattern.compile("a.b");

Matcher matcher = pattern.matcher("acb");

boolean matches = matcher.matches(); // returns true

Java正則表達(dá)式基礎(chǔ)

常用的正則表達(dá)式符號和規(guī)則

正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文本模式。以下是一些常用的元字符和它們的含義:

.:匹配任何單個(gè)字符(除了換行符)。*:匹配前面的元素零次或多次。+:匹配前面的元素一次或多次。?:匹配前面的元素零次或一次。^:匹配輸入字符串的開始位置。$:匹配輸入字符串的結(jié)束位置。{n}:精確匹配n次前面的字符或者表達(dá)式。{n,}:匹配n次或更多次前面的字符或者表達(dá)式。{n,m}:匹配至少n次,至多m次前面的字符或者表達(dá)式。[abc]:匹配方括號內(nèi)的任何字符,例如 a、b 或 c。[^abc]:匹配除了方括號內(nèi)字符的任何字符。(pattern):匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到。\d:匹配數(shù)字,等價(jià)于 [0-9]。\D:匹配非數(shù)字,等價(jià)于 [^0-9]。\s:匹配任何空白字符,包括空格、制表符、換頁符等等,等價(jià)于 [ \f\n\r\t\v]。\S:匹配任何非空白字符,等價(jià)于 [^ \f\n\r\t\v]。\w:匹配字母或數(shù)字或下劃線或漢字,等價(jià)于 [A-Za-z0-9_]。\W:匹配任何非單詞字符,等價(jià)于 [^A-Za-z0-9_]。

Java中的正則表達(dá)式類:Pattern和Matcher

在Java中,正則表達(dá)式的操作主要通過 java.util.regex 包中的兩個(gè)類 Pattern 和 Matcher 來實(shí)現(xiàn)。

Pattern 類:這是一個(gè)正則表達(dá)式的編譯表示。Pattern 對象是一個(gè)多態(tài)的表達(dá)式,給定的正則表達(dá)式必須首先被編譯為此類的一個(gè)實(shí)例。然后,這個(gè)模式可以被用來創(chuàng)建 Matcher 對象,以便匹配任意字符序列。 Matcher 類:通過解釋 Pattern 對象而得到的正則表達(dá)式匹配的引擎。所有的匹配操作都通過這個(gè)類完成。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

// 創(chuàng)建 Pattern 對象

Pattern r = Pattern.compile("[a-z]+");

// 現(xiàn)在創(chuàng)建 matcher 對象

Matcher m = r.matcher("hello world");

boolean b = m.matches();

Java正則表達(dá)式實(shí)例

字符串匹配

在Java中,我們可以使用 String 類的 matches() 方法來測試字符串是否匹配給定的正則表達(dá)式。

String content = "Hello, this is a test.";

// 返回 true

boolean isMatch = content.matches(".*test.*");

在上述代碼中,.*test.* 是一個(gè)正則表達(dá)式,它表示任何包含 “test” 的字符串。

字符串搜索

我們可以使用 Matcher 類的 find() 方法來搜索字符串中的子串。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

String content = "I am a student. I am learning Java.";

Pattern pattern = Pattern.compile("am");

Matcher matcher = pattern.matcher(content);

while (matcher.find()) {

System.out.println("Found at: " + matcher.start() + " - " + matcher.end());

// Found at: 2 - 4

// Found at: 18 - 20

}

在上述代碼中,我們創(chuàng)建了一個(gè) Pattern 對象,用于編譯正則表達(dá)式 “am”,然后使用 Matcher 對象來查找與該模式匹配的子串。

字符串替換

我們可以使用 String 類的 replaceAll() 方法來替換字符串中匹配給定正則表達(dá)式的子串。

String content = "I am a student. I am learning Java.";

String updatedContent = content.replaceAll("am", "AM");

String updatedBlankSpace = content.replaceAll("\\s+", "_")

// 輸出 "I AM a student. I AM learning Java."

System.out.println(updatedContent);

// 輸出 "I_am_a_student._I_am_learning_Java."

System.out.println(updatedBlankSpace);

字符串分割

我們可以使用 String 類的 split() 方法來根據(jù)給定的正則表達(dá)式分割字符串。

String content = "I am a student. I am learning Java.";

String[] words = content.split("\\s+"); // 使用一個(gè)或多個(gè)空格進(jìn)行分割

for (String word : words) {

System.out.println(word);

}

驗(yàn)證電子郵件地址

^:表示字符串的開始。[\\w-]+:匹配一個(gè)或多個(gè)字母、數(shù)字、下劃線或連字符。這部分匹配電子郵件地址的本地部分(即@符號之前的部分)。(\\.[\\w-]+)*:匹配一個(gè)點(diǎn)號后跟一個(gè)或多個(gè)字母、數(shù)字、下劃線或連字符的序列,出現(xiàn)0次或多次。這部分允許本地部分包含點(diǎn)號分隔的子部分。@:匹配一個(gè)@符號。[\\w-]+:匹配一個(gè)或多個(gè)字母、數(shù)字、下劃線或連字符。這部分匹配域名的第一部分。(\\.[\\w-]+)*:匹配一個(gè)點(diǎn)號后跟一個(gè)或多個(gè)字母、數(shù)字、下劃線或連字符的序列,出現(xiàn)0次或多次。這部分允許域名包含點(diǎn)號分隔的子域。(\\.[a-zA-Z]{2,}):匹配一個(gè)點(diǎn)號后跟兩個(gè)或更多字母。這部分匹配頂級域名(如 .com、.org 等)。$:表示字符串的結(jié)束。

所以,這個(gè)正則表達(dá)式的含義是:一個(gè)字符串從開始到結(jié)束必須是一個(gè)有效的電子郵件地址,格式為 local-part@domain,其中 local-part 和 domain 可以包含字母、數(shù)字、下劃線、連字符和點(diǎn)號,頂級域名部分至少包含兩個(gè)字母。 需要注意的是,這個(gè)正則表達(dá)式雖然涵蓋了大多數(shù)常見的電子郵件格式,但并不完全符合所有可能的電子郵件格式。例如,它不支持帶有引號的本地部分或包含特殊字符的域名。如果你需要一個(gè)更精確的電子郵件正則表達(dá)式,可能需要使用更復(fù)雜的模式。

String email = "user@example.com";

Pattern pattern = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)*(\\.[a-zA-Z]{2,})$");

Matcher matcher = pattern.matcher(email);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證手機(jī)號碼(假設(shè)我們只接受10位數(shù)字)

String phoneNumber = "1234567890";

Pattern pattern = Pattern.compile("^\\d{10}$");

Matcher matcher = pattern.matcher(phoneNumber);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證URL

^:表示字符串的開始。(http|https|ftp)://:匹配URL的協(xié)議部分,可以是http、https或ftp,后面跟著://。[^\\s/$.?#].:匹配URL的主機(jī)名部分。具體來說:

[^\\s/$.?#]:匹配除空白字符、/、$、.、?、#之外的任何字符。.:匹配任何字符,除了換行符。 [^\\s]*:匹配除空白字符之外的任何字符,出現(xiàn)0次或多次。$:表示字符串的結(jié)束。

所以,這個(gè)正則表達(dá)式的含義是:一個(gè)字符串從開始到結(jié)束必須是一個(gè)有效的URL,格式為 protocol://hostname/path,其中 protocol 可以是http、https或ftp,hostname 和 path 不能包含空白字符、/、$、.、?、#。 需要注意的是,這個(gè)正則表達(dá)式并不完全符合URL的規(guī)范,例如它不支持包含/、$、.、?、#的路徑,也不支持包含.的主機(jī)名。如果你需要一個(gè)更精確的URL正則表達(dá)式,可能需要使用更復(fù)雜的模式。

String url = "http://www.example.com";

Pattern pattern = Pattern.compile("^(http|https|ftp)://[^\\s/$.?#].[^\\s]*$");

Matcher matcher = pattern.matcher(url);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證IP地址

^:表示字符串的開始。((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}:匹配前三段數(shù)字和它們后面的點(diǎn)號。

25[0-5]:匹配250到255之間的數(shù)字。2[0-4]\\d:匹配200到249之間的數(shù)字。[01]?\\d\\d?:匹配0到199之間的數(shù)字。具體來說:

[01]?:匹配0或1,出現(xiàn)0次或1次。\\d\\d?:匹配一個(gè)或兩個(gè)數(shù)字。 \\.:匹配一個(gè)點(diǎn)號。{3}:表示前面的模式(即 ((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.))重復(fù)3次。 (25[0-5]|2[0-4]\\d|[01]?\\d\\d?):匹配最后一段數(shù)字。

這部分與前面的模式相同,但不包含點(diǎn)號。 $:表示字符串的結(jié)束。

所以,這個(gè)正則表達(dá)式的含義是:一個(gè)字符串從開始到結(jié)束必須是一個(gè)有效的IPv4地址,格式為 xxx.xxx.xxx.xxx,其中每個(gè) xxx 是0到255之間的數(shù)字。

String ip = "192.168.1.1";

Pattern pattern = Pattern.compile("^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$");

Matcher matcher = pattern.matcher(ip);

System.out.println(matcher.matches()); // 輸出:true 或 false

提取字符串中的數(shù)字

String str = "abc123def456";

Pattern pattern = Pattern.compile("\\d+");

Matcher matcher = pattern.matcher(str);

while (matcher.find()) {

System.out.println(matcher.group());

// 輸出 123 456

}

驗(yàn)證是否是數(shù)字

^:表示字符串的開始。\\d:匹配一個(gè)數(shù)字字符。\\d 是一個(gè)轉(zhuǎn)義序列,表示任何一個(gè)數(shù)字(0-9)。+:表示前面的模式(即 \\d)出現(xiàn)一次或多次。如果沒有這個(gè)符號,正則表達(dá)式就只會匹配一個(gè)數(shù)字字符。$:表示字符串的結(jié)束。

所以,這個(gè)正則表達(dá)式的含義是:一個(gè)字符串從開始到結(jié)束只包含一個(gè)或多個(gè)數(shù)字字符。

String number = "12345";

Pattern pattern = Pattern.compile("^\\d+$");

Matcher matcher = pattern.matcher(number);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證是否是字母

^:表示字符串的開始。[a-zA-Z]:這是一個(gè)字符集,匹配任何一個(gè)英文字母,無論大小寫。a-z 表示所有小寫字母,A-Z 表示所有大寫字母。在字符集中,- 是一個(gè)范圍操作符,表示范圍從前面的字符到后面的字符。+:表示前面的模式(即 [a-zA-Z])出現(xiàn)一次或多次。如果沒有這個(gè)符號,正則表達(dá)式就只會匹配一個(gè)字符。$:表示字符串的結(jié)束。 所以,這個(gè)正則表達(dá)式的含義是:一個(gè)字符串從開始到結(jié)束只包含一個(gè)或多個(gè)英文字母(無論大小寫)。

String letters = "abcABC";

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

Matcher matcher = pattern.matcher(letters);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證是否是日期(格式:yyyy-mm-dd)

這個(gè)正則表達(dá)式的含義如下:

^:表示字符串的開始。\\d{4}:匹配四個(gè)數(shù)字。\\d 是一個(gè)表示數(shù)字字符的轉(zhuǎn)義序列,{4} 表示前面的模式(即數(shù)字字符)要出現(xiàn)4次。-:匹配一個(gè)連字符(減號)。\\d{2}:匹配兩個(gè)數(shù)字。\\d 是一個(gè)表示數(shù)字字符的轉(zhuǎn)義序列,{2} 表示前面的模式(即數(shù)字字符)要出現(xiàn)2次。-:匹配一個(gè)連字符(減號)。\\d{2}:匹配兩個(gè)數(shù)字。\\d 是一個(gè)表示數(shù)字字符的轉(zhuǎn)義序列,{2} 表示前面的模式(即數(shù)字字符)要出現(xiàn)2次。$:表示字符串的結(jié)束。

String date = "2024-06-02";

Pattern pattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");

Matcher matcher = pattern.matcher(date);

System.out.println(matcher.matches()); // 輸出:true 或 false

驗(yàn)證密碼強(qiáng)度(至少8個(gè)字符,包含大寫字母,小寫字母和數(shù)字)

這個(gè)正則表達(dá)式的含義如下:

^ 表示字符串的開始。(?=.*[0-9]) 確保字符串中至少包含一個(gè)數(shù)字。(?=.*[a-z]) 確保字符串中至少包含一個(gè)小寫字母。(?=.*[A-Z]) 確保字符串中至少包含一個(gè)大寫字母。.{8,}$ 確保字符串的長度至少為8個(gè)字符,. 表示任意字符,{8,} 表示至少出現(xiàn)8次,$ 表示字符串的結(jié)尾。

String password = "Password123";

Pattern pattern = Pattern.compile("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,}$");

Matcher matcher = pattern.matcher(password);

System.out.println(matcher.matches()); // 輸出:true 或 false

Java正則表達(dá)式的實(shí)現(xiàn)

Java正則表達(dá)式主要由 Pattern 類和 Matcher 類實(shí)現(xiàn)。下面我們來詳細(xì)了解一下這兩個(gè)類的實(shí)現(xiàn)。

Pattern類的實(shí)現(xiàn)

Pattern 類是Java正則表達(dá)式的編譯表示,它的實(shí)例是不可變的,可以安全地被多個(gè)并發(fā)線程使用。Pattern 類沒有公開的構(gòu)造函數(shù),要?jiǎng)?chuàng)建一個(gè) Pattern 對象,你必須首先調(diào)用其公開的靜態(tài) compile 方法,它返回一個(gè) Pattern 對象。這個(gè)方法需要一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。

Pattern pattern = Pattern.compile("[a-z]+");

在上述代碼中,我們創(chuàng)建了一個(gè) Pattern 對象,它表示一個(gè)或多個(gè)小寫字母的序列。

Pattern 類還提供了一些其他的方法,例如:

matcher(CharSequence input):生成一個(gè) Matcher 對象,用于匹配給定的字符序列。split(CharSequence input):根據(jù)此模式分割給定的輸入序列。pattern():返回此模式的字符串表示形式。

Matcher類的實(shí)現(xiàn)

Matcher 類是通過解釋 Pattern 對象而得到的正則表達(dá)式匹配的引擎。所有的匹配操作都通過這個(gè)類完成。

你不能直接創(chuàng)建一個(gè) Matcher 對象,而是需要通過調(diào)用 Pattern 對象的 matcher 方法來創(chuàng)建一個(gè) Matcher 對象。

Pattern pattern = Pattern.compile("[a-z]+");

Matcher matcher = pattern.matcher("hello");

在上述代碼中,我們創(chuàng)建了一個(gè) Matcher 對象,用于匹配字符串 “hello”。

Matcher 類提供了一些方法來進(jìn)行匹配操作,例如:

matches():嘗試將整個(gè)區(qū)域與模式進(jìn)行匹配。find():嘗試查找與模式匹配的輸入序列的下一個(gè)子序列。group():返回由以前匹配操作所匹配的輸入子序列。start():返回以前匹配的初始索引。end():返回最后匹配字符之后的索引。

這就是Java正則表達(dá)式的實(shí)現(xiàn),主要由 Pattern 類和 Matcher 類完成。

Java正則表達(dá)式的性能優(yōu)化

在Java中,正則表達(dá)式是一個(gè)強(qiáng)大而靈活的工具,但如果不正確使用,可能會導(dǎo)致性能問題。以下是一些優(yōu)化Java正則表達(dá)式性能的建議:

預(yù)編譯正則表達(dá)式

在Java中,每次調(diào)用 String 類的 matches(), split(), replaceAll() 等方法時(shí),都會編譯正則表達(dá)式,這是一個(gè)相對耗時(shí)的操作。如果你在循環(huán)或頻繁調(diào)用的方法中使用這些方法,應(yīng)考慮預(yù)編譯正則表達(dá)式。

預(yù)編譯正則表達(dá)式意味著你創(chuàng)建一個(gè) Pattern 對象,然后重復(fù)使用它。這樣,正則表達(dá)式只需要編譯一次,而不是每次使用時(shí)都編譯。

Pattern pattern = Pattern.compile("[a-z]+");

for (String input : inputs) {

Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {

// do something

}

}

在上述代碼中,正則表達(dá)式只編譯了一次,然后在循環(huán)中重復(fù)使用。

使用非捕獲組

在正則表達(dá)式中,使用括號 () 可以創(chuàng)建一個(gè)組,這意味著正則表達(dá)式引擎會記住與括號中的表達(dá)式匹配的文本。然而,這個(gè)記憶功能有時(shí)是不必要的,而且會消耗額外的資源。

如果你不需要記住匹配的文本,可以使用非捕獲組 (?:) 代替普通組。非捕獲組的語法是在括號內(nèi)的第一個(gè)字符位置使用 ?:。

比如,(?:[a-z]+)\d* 匹配一個(gè)或多個(gè)小寫字母后面跟著零個(gè)或多個(gè)數(shù)字,但是不會記住匹配的字母。

這兩個(gè)優(yōu)化技巧可以幫助你提高Java正則表達(dá)式的性能。然而,你應(yīng)該注意,正則表達(dá)式不總是解決問題的最佳工具。在某些情況下,使用其他的字符串處理方法可能更有效。

柚子快報(bào)邀請碼778899分享:java 正則表達(dá)式的使用

http://yzkb.51969.com/

文章來源

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19184754.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄