日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 正则表达式

發(fā)布時(shí)間:2024/8/1 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 正则表达式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正則表達(dá)式

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class regexp_01 {public static void main(String[] args) {String s = "由于在開(kāi)發(fā)Oak語(yǔ)言時(shí),尚且不存在運(yùn)行字節(jié)碼的硬件平臺(tái),所以為了在開(kāi)發(fā)時(shí)可以對(duì)這種語(yǔ)言進(jìn)行實(shí)驗(yàn)研究,他們就在已有的" +"硬件和軟件平臺(tái)基礎(chǔ)上,按照自己所指定的規(guī)范,用軟件建設(shè)了一個(gè)運(yùn)行平臺(tái),整個(gè)系統(tǒng)除了比C++更加簡(jiǎn)單之外,沒(méi)有什么大的區(qū)" +"別。1992年的夏天,當(dāng)Oak語(yǔ)言開(kāi)發(fā)成功后,研究者們向硬件生產(chǎn)商進(jìn)行演示了Green操作系統(tǒng)、Oak的程序設(shè)計(jì)語(yǔ)言、類庫(kù)和其" +"硬件,以說(shuō)服他們使用Oak語(yǔ)言生產(chǎn)硬件芯片,但是,硬件生產(chǎn)商并未對(duì)此產(chǎn)生極大的熱情。因?yàn)樗麄冋J(rèn)為,在所有人對(duì)Oak語(yǔ)言" +"還一無(wú)所知的情況下,就生產(chǎn)硬件產(chǎn)品的風(fēng)險(xiǎn)實(shí)在太大了,所以O(shè)ak語(yǔ)言也就因?yàn)槿狈τ布闹С侄鵁o(wú)法進(jìn)入市場(chǎng),從而被擱置了下" +"來(lái)。\n" +"1994年6、7月間,在經(jīng)歷了一場(chǎng)歷時(shí)三天的討論之后,團(tuán)隊(duì)決定再一次改變了努力的目標(biāo),這次他們決定將該技術(shù)應(yīng)用于" +"萬(wàn)維網(wǎng)。他們認(rèn)為隨著Mosaic瀏覽器的到來(lái),因特網(wǎng)正在向同樣的高度互動(dòng)的遠(yuǎn)景演變,而這一遠(yuǎn)景正是他們?cè)谟芯€電視網(wǎng)中看" +"到的。作為原型,帕特里克·諾頓寫了一個(gè)小型萬(wàn)維網(wǎng)瀏覽器WebRunner。";//1.\\d表示一個(gè)任意的數(shù)字String regStr = "(\\d\\d)(\\d\\d)";//2.創(chuàng)建模式對(duì)象[即正則表達(dá)式對(duì)象]Pattern pattern = Pattern.compile(regStr);//3.創(chuàng)建匹配器//說(shuō)明:創(chuàng)建匹配器matcher,按照正則表達(dá)式的規(guī)則Matcher matcher = pattern.matcher(s);//4.開(kāi)始匹配//matcher.find() 完成的任務(wù)//1.根據(jù)指定的規(guī)則,定位滿足規(guī)則的子字符串(1998)//2.找到后,將子字符串的開(kāi)始索引記錄到matcher對(duì)象的屬性int[] groups的groups[0]中,// 把子字符串的結(jié)束的索引+1的值記錄到groups[1]//3.同時(shí)記錄oldLast的值為groups[1],即下次執(zhí)行find時(shí),從oldLast開(kāi)始匹配//什么是分組,比如(\\d\\d)(\\d\\d),正則表達(dá)式中有() 表示分組,第一個(gè)()表示第一組,第二個(gè)()表示第二組,以此類推//例如找到(19)(98)//則記錄第一組()匹配到的字符 groups[2]=0 (第一組中1所在的下標(biāo)) groups[3]=1+1=2 (第一組中9所在的下標(biāo)加1)//則記錄第二組()匹配到的字符 groups[4]=2 (第二組中9所在的下標(biāo)) groups[5]=3+1=4 (第二組中8所在的下標(biāo)加1)//調(diào)用時(shí),matcher.group(1)和matcher.group(2)返回第一組和第二組截取的字符串//matcher.group(0)完成的任務(wù)//根據(jù)groups[0]和groups[1]記錄的位置,截取子字符串,即[groups[0],groups[1])//如果正則表達(dá)式取出的組大于定義的組,則由于初始化groups為-1,會(huì)出現(xiàn)數(shù)組越界,建議查看源碼while(matcher.find()){System.out.println("找到:"+matcher.group(0));System.out.println("找到第一組內(nèi)容:"+matcher.group(1));System.out.println("找到第二組內(nèi)容:"+matcher.group(2));}} }

一.底層原理

(1).matcher.find() 完成的任務(wù)

1.根據(jù)指定的規(guī)則,定位滿足規(guī)則的子字符串

2.找到后,將子字符串的開(kāi)始索引記錄到matcher對(duì)象的屬性int[] groups的groups[0]中,
把子字符串的結(jié)束的索引+1的值記錄到groups[1]

3.同時(shí)記錄oldLast的值為groups[1],即下次執(zhí)行find時(shí),從oldLast開(kāi)始匹配

(2)matcher.group(0)完成的任務(wù)

根據(jù)groups[0]和groups[1]記錄的位置,截取子字符串,即[groups[0],groups[1])

(3)什么是分組,比如(\d\d)(\d\d),正則表達(dá)式中有() 表示分組,第一個(gè)()表示第一組,第二個(gè)()表示第二組,以此類推

例如找到(19)(98)

則記錄第一組()匹配到的字符 groups[2]=0 (第一組中1所在的下標(biāo)) groups[3]=1+1=2 (第一組中9所在的下標(biāo)加1)

則記錄第二組()匹配到的字符 groups[4]=2 (第二組中9所在的下標(biāo)) groups[5]=3+1=4 (第二組中8所在的下標(biāo)加1)

調(diào)用時(shí),matcher.group(1)和matcher.group(2)返回第一組和第二組截取的字符串

即:matcher.group(0)表示匹配到的字符串,matcher.group(1)表示匹配到的第一組子字符串,matcher.group(2)表示匹配到的第二組子字符串…依此類推

二.正則表達(dá)式語(yǔ)法

(1)轉(zhuǎn)義號(hào)\\

在檢索特殊字符( .*+()$/?[]^{} )時(shí),需要用到\\,否則報(bào)錯(cuò)

在java中,兩個(gè)\\代表其他語(yǔ)言中一個(gè)\

(2)字符匹配符


\\w還可以匹配下劃線

如何不指定大小寫?


\\s匹配任何空白字符
\\S匹配任何非空白字符

(3)選擇匹配符

(4)限定符


Java匹配是貪婪匹配,即盡可能匹配多的
非貪婪匹配,在限定符后面加一個(gè) ?

(5)定位符

\\b邊界可能是字符串最后,也可以是空格的字符串子串的后面

(6)分組

演示代碼:

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class regexp_04 {public static void main(String[] args) {//非命名捕獲 // String content = "zhrzhr s7789 nn1189n"; // String regStr = "(\\d\\d)(\\d\\d)"; // // Pattern pattern = Pattern.compile(regStr); // Matcher matcher = pattern.matcher(content); // // while(matcher.find()){ // System.out.println(matcher.group(0)); // System.out.println("第一個(gè)分組為:"+matcher.group(1)); // System.out.println("第二個(gè)分組為:"+matcher.group(2)); // }//命名捕獲String content = "zhrzhr s7789 nn1189n";String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){System.out.println(matcher.group(0));//可以用非命名捕獲的內(nèi)容,也可以通過(guò)名字來(lái)獲取System.out.println("第一個(gè)分組為:"+matcher.group("g1"));System.out.println("第二個(gè)分組為:"+matcher.group("g2"));}} }

非捕獲分組

舉例:

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class regexp_05 {public static void main(String[] args) {//找吃火鍋 吃麻辣燙 吃燒烤中的子串 (?:... )String content = "吃火鍋 吃麻辣燙 吃燒烤";String regStr = "吃(?:火鍋|麻辣燙|燒烤)";// Pattern pattern = Pattern.compile(regStr); // Matcher matcher = pattern.matcher(content); // // while(matcher.find()){ // System.out.println(matcher.group(0)); // }//找吃火鍋 吃麻辣燙中的吃 (?= ...) // regStr = "吃(?=火鍋|麻辣燙)"; // Pattern pattern = Pattern.compile(regStr); // Matcher matcher = pattern.matcher(content); // // while(matcher.find()){ // System.out.println(matcher.group(0)); // }//找吃這個(gè)關(guān)鍵字,但是找不是吃火鍋中的吃 (?!... )regStr = "吃(?!火鍋)";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);while(matcher.find()){System.out.println(matcher.group(0));}} }

三.正則表達(dá)式常用類

1.Pattern.matcher(regStr,content)是整體驗(yàn)證,常用方法,返回Boolean值

2.Pattern常用方法

注意:end()是最后元素的下標(biāo)加1

3.Matcher常用方法

注意:replaceAll("…")返回的才是替換后的字符串,原字符串不變

四.反向引用


舉例

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class regexp_09 {public static void main(String[] args) {//判斷是否是4位回文數(shù)字 // String content = "1221"; // String regStr = "(\\d)(\\d)\\2\\1"; // // Pattern pattern = Pattern.compile(regStr); // Matcher matcher = pattern.matcher(content); // // if(matcher.find()){ // System.out.println(matcher.group(0)); // }String content = "12321-333999111";String regStr = "\\d{5}-(\\d)\\1\\1(\\d)\\2\\2(\\d)\\3\\3";Pattern pattern = Pattern.compile(regStr);Matcher matcher = pattern.matcher(content);if(matcher.find()){System.out.println(matcher.group(0));}} }

我…我要…學(xué)學(xué)學(xué)習(xí)習(xí)Java 變?yōu)?我要學(xué)習(xí)Java

import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class exercise_03 {public static void main(String[] args) {String str = "我...我要...學(xué)學(xué)學(xué)習(xí)習(xí)Java";//先去除.str = Pattern.compile("\\.").matcher(str).replaceAll("");//再去除重復(fù)的字str = Pattern.compile("(.)\\1+").matcher(str).replaceAll("$1");System.out.println(str);} }

驗(yàn)證電子郵件是否合法

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @author ZHR* @version 1.0**/ public class exercise_04 {public static void main(String[] args) {//驗(yàn)證電子郵件是否合法String content = "1184524381@qq.org.com";String regStr = "^\\w+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//這里使用String的match方法,整體匹配正則表達(dá)式if(content.matches(regStr)){System.out.println("匹配成功");}else{System.out.println("匹配失敗");}} }

總結(jié)

以上是生活随笔為你收集整理的Java 正则表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。