Java中Stringbuilder和正則表達(dá)式示例詳解
StringBuilder
String 類(lèi)型的連接性能不好,StringBuilder可以解決字符串連接性能問(wèn)題。
在String類(lèi)型中,字符串是不可變的,每次連接字符串時(shí)都會(huì)創(chuàng)建一個(gè)新的String對(duì)象,這會(huì)導(dǎo)致頻繁的內(nèi)存分配和拷貝操作,影響性能。而StringBuilder是可變的,可以在原有的字符串上進(jìn)行操作,避免了頻繁的內(nèi)存分配和拷貝,提高了連接字符串的性能。因此,使用StringBuilder可以更有效地處理大量的字符串連接操作。
String s1 = "ABC"; String s2 = "def"; String s3 = s1 + s2;
字符串連接性能測(cè)試:
String str = "";
long t1 = System.currentTimeMillis();
for(int i=0; i<50000; i++){
str = str + "A";
}
long t2 = System.currentTimeMillis();
System.out.pritnln(t2 - t1);StringBuilder 用于提升String字符串的連接性
- - StringBuilder稱(chēng)為可變字符串
- - StringBuilder內(nèi)部也是字符數(shù)組, 其API可以直接修改其內(nèi)部數(shù)組的內(nèi)容
- - 當(dāng)數(shù)組容量不足時(shí)候, 會(huì)自動(dòng)擴(kuò)容
- - 運(yùn)算期間會(huì)盡力減少創(chuàng)建數(shù)組的數(shù)量。
package string;
public class StringBuilderDemo03 {
public static void main(String[] args) {
/*
* 測(cè)試StringBuilder的連接性能
*/
StringBuilder buf = new StringBuilder();
long t1 = System.currentTimeMillis();
for (int i =0; i<50000; i++){
buf.append("A");
}
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}
//StringBuilder API
buf-> char[]{A, C, B, 0, 0, 0, 0, 0, 0, 0, 0...0}
// 0 1 2 3 4 5
StringBuilder buf = new StringBuilder();
buf.append("A")
.append("A")
.append("A")
.append("B")
.insert(1,"C")
.delete(2,4);
Stirng str = buf.toString();
- - append() 追加, 在StringBuilder的后面添加字符,當(dāng)容量滿了,會(huì)自動(dòng)擴(kuò)容, 擴(kuò)容規(guī)則 1倍+2;
- - insert(位置,字符) 插入字符;
- - delete(開(kāi)始位置, 結(jié)束位置): 刪除一定范圍的字符,包括開(kāi)始,不包括結(jié)束
- - StringBuilder的API返回的大多是當(dāng)前對(duì)象,可以連續(xù)使用.調(diào)用方法。
- - toString() 方法可以講StringBuilder轉(zhuǎn)換為String
正則表達(dá)式
用于檢測(cè)、測(cè)試字符串規(guī)則的表達(dá)式.
經(jīng)常用于檢測(cè)字符串是否符合特定的規(guī)則,在網(wǎng)站上經(jīng)常用于檢測(cè)用戶輸入數(shù)據(jù)是否符合規(guī)范:
- - 檢測(cè) 用戶名 是否為 8~10 數(shù)字 英文(大小寫(xiě))
- - 檢測(cè) 電話號(hào)碼是否符合規(guī)則
- - 檢測(cè) 郵箱地址是否符合規(guī)則
正則HelloWorld
最簡(jiǎn)單的正則表達(dá)式:"HelloWorld" 表示
- 一共有10個(gè)字符
- 出現(xiàn)的順序必須是 HelloWorld
- 用于檢測(cè)一個(gè)字符串是否符合,正則規(guī)則
- boolean matchs(正則) 檢測(cè)當(dāng)前字符串是否符合正則規(guī)則
正則規(guī)則 rule = "HelloWorld" 字符串: s1 = "HelloKitty"; 字符串: s2 = "HelloWorld"; // s1 s2 中那個(gè)字符串符合 rule 約定的規(guī)則? boolean b1 = s1.matches(rule); //false boolean b2 = s2.matches(rule); //true
package string;
public class RegDemo05 {
public static void main(String[] args) {
/*
* 測(cè)試正則表達(dá)式
*/
//定義正則表達(dá)式
String rule = "HelloWorld";
//定義被檢測(cè)的字符串
String s1 = "HelloKitty";
String s2 = "HelloWorld";
//檢測(cè) s1 是否符合規(guī)則
boolean b1 = s1.matches(rule);
//檢測(cè) s2 是否符合規(guī)則
boolean b2 = s2.matches(rule);
System.out.println(b1);
System.out.println(b2);
}
}字符集
匹配一個(gè)有效字符范圍。
語(yǔ)法:
[123456]
意義:
- 匹配一個(gè)字符
- 其有效范圍: 1 2 3 4 5 6 中的某一個(gè)
正則規(guī)則例子:
Hello[123456]
- - 匹配6個(gè)字符
- - 前5個(gè)必須是Hello
- - 第6個(gè)字符,必須 1 2 3 4 5 6 中的一個(gè)
如, 可以匹配的字符串:
- - "Hello1"
- - "Hello2"
- - "Hello3"
- - ...
- - "Hello6"
- - "Hello7" 不可以匹配!
- - “HelloA” 不可以
正則例子: 我[草去艸]
字符范圍
| 規(guī)則 | 正則表達(dá)式 | 范圍 | | ------------------ | ---------------------------- | -------- | | 匹配 0~9 一個(gè)字符 | [0123456789] | [0-9] | | 匹配A-Z一個(gè)字符 | [ABCDEFGHIJKLMNOPQRSTUVWXYZ] | [A-Z] | | 匹配a-z一個(gè)字符 | ... | [a-z] | | 匹配a-zA-Z一個(gè)字符 | | [a-zA-Z] |
栗子:
Hello[1-6]
預(yù)定義字符集
| 規(guī)則 | 正則 | 預(yù)定義字符集 | 栗子 | | ------------------ | ------------ | ------------ | ------------ | | 匹配一個(gè)數(shù)字 | [0-9] | \d | Hello\d | | 匹配一個(gè)單詞字符 | [a-zA-Z0-9_] | \w | A\w | | 匹配一個(gè)空白字符 | | \s | Hello\sWorld | | 匹配任意一個(gè)字符 | | . | A. | | 匹配一個(gè)非數(shù)字 | | \D | | | 匹配一個(gè)非空白 | | \S | | | 匹配一個(gè)非單詞字符 | | \W | |
栗子, 網(wǎng)站上規(guī)則 用戶名規(guī)則是6個(gè)單詞字符:
- 正則規(guī)則: \w\w\w\w\w\w
- java String: `"\\w\\w\\w\\w\\w\\w"`
測(cè)試案例:
package string;
public class RegDemo07 {
public static void main(String[] args) {
/*
* 測(cè)試 用戶名規(guī)則:6個(gè)單詞字符組成
* - \ 在java字符串中需要進(jìn)行轉(zhuǎn)義為 \\
*/
//正則表達(dá)式:
String reg = "\\w\\w\\w\\w\\w\\w";
System.out.println(reg);
//被檢查的字符串
String s1 = "Jerry1"; //可以通過(guò)檢查
String s2 = "Tom-12"; //不可以通過(guò)檢查
String s3 = "Andy"; //不可以通過(guò)檢查
System.out.println(s1.matches(reg));
System.out.println(s2.matches(reg));
System.out.println(s3.matches(reg));
}
}數(shù)量詞
約定左側(cè)元素出現(xiàn)的次數(shù)。
栗子:
\w\w\w\w\w\w 等價(jià) \w{6} 語(yǔ)法:
- X{n} 規(guī)定左側(cè)X出現(xiàn)n次
- X{n,m} 規(guī)定左側(cè)X出現(xiàn)最少n次, 最多m次
- X{0,n} 規(guī)定左側(cè)X出現(xiàn)0到n次
- X{n,} 規(guī)定左側(cè)X出現(xiàn)最少n次
- X? 和 X{0,1} 等價(jià),X可以沒(méi)有或者有一個(gè)
- X+ 和 X{1,} 等價(jià),X至少有一個(gè),多了隨意,簡(jiǎn)稱(chēng):一個(gè)以上
- X* 和 X{0,} 等價(jià),X至少有0個(gè),多了隨意 簡(jiǎn)稱(chēng):0個(gè)以上
栗子:
- - 網(wǎng)站的用戶名是 8~16個(gè)單詞字符: \w{8,16}
- - 網(wǎng)站的密碼是單詞字符, 最少8個(gè), 多了不限: \w{8,}
- - 匹配Hello World,中間至少有一個(gè)空白: Hello\s+World
- - 不能匹配 : "HelloWorld"
- - 不能匹配: "Hello World!"
- - 能匹配: "Hello World"
- - 能匹配: "Hello World"
- - 能匹配: "Hello World"
特殊字符轉(zhuǎn)義
如何匹配字符 [ ] ? + * . , 使用 \特殊字符, 進(jìn)行轉(zhuǎn)義!
\. 匹配點(diǎn) \[ 匹配 [ \? 匹配 ? \* 匹配 * \+ 匹配 + \\ 匹配 \
如下正則的意義:匹配 `www.fish.cn` 域名
- www.fish.cn 匹配:
- www.fish.cn 通過(guò)
- wwwfishAcn 通過(guò)
- www-fish-cn 通過(guò)- `www\.fish\.cn` 匹配
- www.fish.cn 通過(guò)
- wwwfishAcn 不通過(guò)
- www-fish-cn 不通過(guò)
案例:如何檢查一個(gè)字符串是否為正確的IPv4地址
正確IP:
"192.168.1.25" "192.168.199.1" "10.0.0.20" "8.8.8.8"
錯(cuò)誤的IP:
"10-10-10-20" "192點(diǎn)168點(diǎn)5點(diǎn)25"
正則:`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`
分組
講一組規(guī)則作為整體進(jìn)行處理
栗子正則:
1. `\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`
2. `(\d{1,3}\.)(\d{1,3}\.)(\d{1,3}\.)\d{1,3}`
3. `(\d{1,3}\.){3}\d{1,3}````java
package string;
public class RegDemo11 {
public static void main(String[] args) {
/*
* 檢查IP地址是否符合規(guī)則
*/
//定義正則規(guī)則
//String reg = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
String reg = "\\d{1,3}(\\.\\d{1,3})(\\.\\d{1,3})(\\.\\d{1,3})";
//String reg = "(\\d{1,3}\\.){3}\\d{1,3}"; //測(cè)試分組
//定義被檢查的字符串
String ip1 = "192.168.2.70";
String ip2 = "10.0.0.20";
String ip3 = "8.8.8.8";
//定義錯(cuò)誤的被檢查字符串
String ip4 = "192點(diǎn)168點(diǎn)2點(diǎn)70";
String ip5 = "192-168-2-70";
//檢查
System.out.println(ip1.matches(reg));
System.out.println(ip2.matches(reg));
System.out.println(ip3.matches(reg));
System.out.println(ip4.matches(reg));
System.out.println(ip5.matches(reg));
}
}
栗子2:
1. `\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`
2. `\d{1,3}(\.\d{1,3})(\.\d{1,3})(\.\d{1,3})`
3. `\d{1,3}(\.\d{1,3}){3}`區(qū)別:
(\d{1,3}\.){3}\d{1,3} (分組){3} 分組的整體出現(xiàn)3次
\d{1,3}\.{3}\d{1,3} \.{3} .必須出現(xiàn)2次,可以匹配 “192...168”正則API
- - matches 檢查字符串是否整體符合正則表達(dá)式規(guī)則
- - split 劈開(kāi)
- - replaceAll 全部替換
Split 劈開(kāi)字符串(重要)
將一個(gè)字符串劈開(kāi)為幾個(gè)子字符串:
- - "192.168.5.140" 劈開(kāi)為 "192" "168" "5" "140"
- - "1, Tom, 110, tom@tedu.cn" 劈開(kāi)為 "1" "Tom" "110" "tom@tedu.cn"
使用:
str 存儲(chǔ)的是被劈開(kāi)的字符串
正則 用于匹配劈開(kāi)的位置點(diǎn), 如: , 或者 \.
返回值 是劈開(kāi)以后的數(shù)組,每個(gè)元素是 劈開(kāi)的子字符串段落
劈開(kāi)以后,匹配的位置就沒(méi)有了
String[] arr = str.split(正則);
案例:
String str = "1, Tom, 110, tom@tedu.cn";
// , , ,
// arr= "1" " Tom" " 110" " tom@tedu.cn"
String[] arr = str.split(",");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}replaceAll
- replace: 替換
- all:全部
將正則表達(dá)式匹配到的字符,都替換為新字符串
例子:
我天疫情又嚴(yán)重了,我去,又要做核算了。
需要替換為 `***疫情又嚴(yán)重了,***,又要做核算了。`
代碼:
Scanner scanner = new Scanner(System.in);
System.out.print("請(qǐng)輸入:");
String str = scanner.nextLine();
//String str = "我天疫情又嚴(yán)重了,我去,又要做核算了。";
// str.replaceAll("正則", 替換字符串);
String s = str.replaceAll("我[去草靠艸]", "***");
System.out.println(s);總結(jié)
到此這篇關(guān)于Java中Stringbuilder和正則表達(dá)式的文章就介紹到這了,更多相關(guān)Java Stringbuilder和正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java8?Stream流的skip?+?limit實(shí)現(xiàn)批處理的方法
Stream 作為 Java 8 的一大亮點(diǎn),它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念這篇文章主要介紹了使用Java8?Stream流的skip?+?limit實(shí)現(xiàn)批處理,需要的朋友可以參考下2022-07-07
JDK SPI機(jī)制以及自定義SPI類(lèi)加載問(wèn)題
這篇文章主要介紹了JDK SPI機(jī)制以及自定義SPI類(lèi)加載問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解
這篇文章主要介紹了SpringBoot在RequestBody中使用枚舉參數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Java實(shí)現(xiàn)把excel xls中數(shù)據(jù)轉(zhuǎn)為可直接插入數(shù)據(jù)庫(kù)的sql文件
這篇文章主要介紹了Java實(shí)現(xiàn)把excel xls中數(shù)據(jù)轉(zhuǎn)為可直接插入數(shù)據(jù)庫(kù)的sql文件 的相關(guān)資料,需要的朋友可以參考下2016-03-03
Spring Security OAuth2實(shí)現(xiàn)使用JWT的示例代碼
這篇文章主要介紹了Spring Security OAuth2實(shí)現(xiàn)使用JWT的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Java?System#exit無(wú)法退出程序的問(wèn)題及解決
這篇文章主要介紹了Java?System#exit無(wú)法退出程序的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Mybatis-Plus中IdType.AUTO局部配置不生效的問(wèn)題解決
本文主要介紹了Mybatis-Plus中IdType.AUTO局部配置不生效的問(wèn)題解決,數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí),id的默認(rèn)生成方式還是雪花算法,局部配置沒(méi)有生效,下面就來(lái)解決一下,感興趣的可以了解一下2023-09-09
java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例
這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計(jì)sql執(zhí)行時(shí)間2014-03-03
基于FeignException$InternalServerError的解決方案
這篇文章主要介紹了FeignException$InternalServerError的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

