Java正則表達(dá)式匹配實(shí)例詳解
一、正則表達(dá)式匹配
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExtract {
public static boolean isEmpty(final CharSequence cs) {
return cs == null || cs.length() == 0;
}
private static String getRegexValue(String input, String regex, int group) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
return matcher.group(group);
}
return "";
}
public static String getTableNameFromCreateTableSql(String sql) throws IOException {
String checkResult = "";
// 匹配出 schema.表名
// String regex = "create\\s*table\\s*(if\\s*not\\s*exists\\s*)?(.*)(\\s\\()";
// String exceptionTableName = getRegexValue(sql.toLowerCase(), regex, 2);
// 匹配出 表名
String regex = "create\\s*table\\s*(if\\s*not\\s*exists\\s*)?(.*\\.)?(.*)(\\s\\()";
String exceptionTableName = getRegexValue(sql.toLowerCase(), regex, 3);
if (!isEmpty(exceptionTableName))
checkResult = exceptionTableName;
return checkResult;
// return exceptionTableName;
}
public static String getTableNameFromCreateTableSql2(String sql) throws IOException {
String tableName = "";
String regex = "create\\s*table\\s*(if\\s*not\\s*exists\\s*)?(.*\\.)?(.*)(\\s\\()";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sql);
if (matcher.find()) {
tableName = matcher.group(3); // 提取匹配的部分
} else {
tableName = "";
}
return tableName;
}
public static void main(String[] args) throws IOException {
String sql = "";
sql = "CREATE TABLE tzq_gd.tzq_log_t (";
String result = getTableNameFromCreateTableSql(sql);
System.out.println(result);
String result2 = getTableNameFromCreateTableSql2(sql);
System.out.println(result2);
}
}二、正則表達(dá)式說(shuō)明
2.1、\w
\w
在正則表達(dá)式中,\w 是一個(gè)元字符,用來(lái)匹配任何字母數(shù)字字符及下劃線。具體來(lái)說(shuō),它等價(jià)于 [a-zA-Z0-9_],這意味著它可以匹配:
- 任何單個(gè)字母(大寫(xiě)或小寫(xiě)),即
a到z和A到Z - 任何單個(gè)數(shù)字,即
0到9 - 下劃線
_
例如,在字符串 “Hello123” 中,\w 可以匹配每一個(gè)字符 “H”、“e”、“l”、“l”、“o”、“1”、“2” 和 “3”。
2.2、*
*
在正則表達(dá)式中,星號(hào) * 是一個(gè)量詞,它表示其前一個(gè)字符(或字符組)可以出現(xiàn)任意次,包括0次。具體來(lái)說(shuō),如果在正則表達(dá)式中某個(gè)字符后面加上星號(hào) *,那么這個(gè)字符可以不出現(xiàn),或者出現(xiàn)一次,或者多次。
例如:
a*匹配任何包含零個(gè)或多個(gè) ‘a’ 的字符串,如:""(空字符串),"a","aa","aaa"等。ba*n匹配以 ‘b’ 開(kāi)始,后跟零個(gè)或多個(gè) ‘a’,最后是一個(gè) ‘n’ 的字符串,如:"bn","ban","baan","baaan"等。
2.3、?
?
在正則表達(dá)式中,問(wèn)號(hào) ? 也是一個(gè)量詞,它表示其前一個(gè)字符(或字符組)可以出現(xiàn)0次或1次。換句話說(shuō),問(wèn)號(hào) ? 使得前一個(gè)字符變?yōu)榭蛇x的。
具體來(lái)說(shuō):
a?匹配包含零個(gè)或一個(gè) ‘a’ 的字符串,如:""(空字符串),"a"。colou?r匹配 “color” 和 “colour”。
舉一些例子:
a?b可以匹配"b"和"ab"。http://www\.example\.com/?(index\.html)?可以匹配http://www.example.com/和http://www.example.com/index.html。
2.4、.
.
在正則表達(dá)式中,“.” 是一個(gè)特殊字符(元字符),它的意思是:
匹配除換行符以外的任意單個(gè)字符。
舉個(gè)例子來(lái)說(shuō)明:
正則表達(dá)式:a.c
這個(gè)正則表達(dá)式表示:
- 匹配以
a開(kāi)頭, - 中間有一個(gè)任意字符(但不能是換行符),
- 以
c結(jié)尾 的三個(gè)字符的字符串。
匹配結(jié)果:
abc?a2c?a c?(中間是空格)ac?(因?yàn)橹挥袃蓚€(gè)字符,中間沒(méi)有字符)a c?(中間是換行符,.不匹配換行符)
補(bǔ)充說(shuō)明:
- 如果你希望
.能匹配包括換行符在內(nèi)的所有字符,通常需要使用“單行模式”(也叫“點(diǎn)號(hào)匹配所有模式”),具體語(yǔ)法因語(yǔ)言而異。例如:- 在 Python 中使用
re.DOTALL標(biāo)志; - 在 JavaScript 中使用
s修飾符(如/a.c/s); - 在 Java 中使用
Pattern.DOTALL。
- 在 Python 中使用
總結(jié):
| 字符 | 含義 |
|---|---|
. | 匹配任意一個(gè)字符(除換行符 ` |
| ` 以外) |
2.5、()
()
1. 單個(gè)括號(hào)()的作用(分組)
括號(hào) () 在正則表達(dá)式中主要有以下幾個(gè)用途:
a.分組表達(dá)式
將多個(gè)字符或子表達(dá)式組合為一個(gè)整體,例如:
(ab)+
這個(gè)表達(dá)式匹配的是 ab 重復(fù)一次或多次,比如 ab, abab, ababab 等。
b.捕獲分組
括號(hào)可以捕獲匹配的內(nèi)容,并可以通過(guò)反向引用(如 \1, \2 等)來(lái)引用這些內(nèi)容。
例如:
(\d{3})-(\d{3}-\d{4})
這個(gè)正則可以匹配電話號(hào)碼如 123-456-7890,其中:
(\d{3})捕獲前三個(gè)數(shù)字;(\d{3}-\d{4})捕獲后面的數(shù)字部分;\1和\2可以引用這兩個(gè)分組的內(nèi)容。
2. “雙括號(hào)”(())的含義(即嵌套括號(hào))
如果你看到的是 雙括號(hào) (()),這表示的是嵌套的分組,比如:
((a)(b))
這個(gè)表達(dá)式匹配的是 ab,并將其分為兩個(gè)分組:
- 第一個(gè)括號(hào)
((a)(b))是整個(gè)分組; - 第二個(gè)括號(hào)
(a)是第一個(gè)分組內(nèi)的子分組; - 第三個(gè)括號(hào)
(b)也是第一個(gè)分組內(nèi)的另一個(gè)子分組。
這種結(jié)構(gòu)在反向引用中可能會(huì)用到,例如:
(\d{3})-(\d{3})-(\d{4})
可以寫(xiě)成嵌套形式:
((\d{3})-(\d{3}))-(\d{4})
3. 非捕獲分組((?:...))
如果你只是想分組而不捕獲內(nèi)容(即不想保存匹配的內(nèi)容),可以使用非捕獲分組:
(?:abc)+
這個(gè)表達(dá)式匹配的是 abc 重復(fù)一次或多次,但不會(huì)保存每個(gè)匹配的內(nèi)容。
總結(jié)
| 表達(dá)式 | 說(shuō)明 |
|---|---|
() | 捕獲分組,同時(shí)分組和保存匹配內(nèi)容 |
(()) | 嵌套分組,多個(gè)分組層級(jí) |
(?:...) | 非捕獲分組,僅分組不保存 |
如果你看到的是 () 但不是嵌套的情況,那它就是普通的分組和捕獲操作。
到此這篇關(guān)于Java正則表達(dá)式匹配的文章就介紹到這了,更多相關(guān)Java正則表達(dá)式匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java正則表達(dá)式之替換匹配文本和查找所有匹配項(xiàng)方式
- java 正則表達(dá)式匹配Matcher類(lèi)的使用
- Java正則表達(dá)式之全量匹配和部分匹配
- Java 中的正則表達(dá)式單字符預(yù)定義字符匹配問(wèn)題
- JAVA正則表達(dá)式匹配多個(gè)空格的解決方案
- Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換
- java如何用正則表達(dá)式匹配與提取字符串
- Java使用正則表達(dá)式(regex)匹配中文實(shí)例代碼
- java正則表達(dá)式四種常用的處理方式(匹配、分割、替代、獲取)
- 學(xué)習(xí)Java正則表達(dá)式(匹配、替換、查找)
相關(guān)文章
基于HTML5+js+Java實(shí)現(xiàn)單文件文件上傳到服務(wù)器功能
應(yīng)公司要求,在HTML5頁(yè)面上實(shí)現(xiàn)上傳文件到服務(wù)器功能,對(duì)于我這樣的菜鳥(niǎo),真是把我難住了,最后還是請(qǐng)教大神搞定的,下面小編把例子分享到腳本之家平臺(tái),供大家參考2017-08-08
Java類(lèi)加載異常:java.lang.ClassNotFoundException解決方法
這篇文章主要給大家介紹了關(guān)于Java類(lèi)加載異常:java.lang.ClassNotFoundException的解決方法,異常是Java編程語(yǔ)言中的一個(gè)標(biāo)準(zhǔn)異常類(lèi),它繼承自類(lèi),當(dāng)在運(yùn)行時(shí)嘗試加載類(lèi)時(shí),如果系統(tǒng)找不到指定的類(lèi)文件就會(huì)拋出該異常,需要的朋友可以參考下2023-11-11
JPA之EntityManager踩坑及解決:更改PersistenceContext
這篇文章主要介紹了JPA之EntityManager踩坑及解決:更改PersistenceContext方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)
本文主要介紹了SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
Vue計(jì)算屬性computed和監(jiān)聽(tīng)屬性watch的使用解讀
本文介紹了Vue.js中的計(jì)算屬性(computed)和監(jiān)聽(tīng)屬性(watch)的區(qū)別和使用場(chǎng)景,計(jì)算屬性是基于依賴緩存的,只有在相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值,適合用于簡(jiǎn)單的數(shù)據(jù)處理和計(jì)算,而監(jiān)聽(tīng)屬性則用于監(jiān)聽(tīng)數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷(xiāo)較大的操作,適合用于處理復(fù)雜的數(shù)據(jù)邏輯2025-12-12
SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
SpringBoot項(xiàng)目找不到接口報(bào)404錯(cuò)誤的解決辦法
寫(xiě)了一個(gè)簡(jiǎn)單的springboot項(xiàng)目,在啟動(dòng)的時(shí)候idea未報(bào)錯(cuò),瀏覽器訪問(wèn)接口時(shí)報(bào)404的錯(cuò)誤,所以本文給大家介紹了SpringBoot項(xiàng)目找不到接口報(bào)404錯(cuò)誤的解決辦法,文中有相關(guān)的圖文供大家參考,需要的朋友可以參考下2024-12-12
java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)
這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

