Java正則表達式匹配實例詳解
一、正則表達式匹配
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);
}
}二、正則表達式說明
2.1、\w
\w
在正則表達式中,\w 是一個元字符,用來匹配任何字母數(shù)字字符及下劃線。具體來說,它等價于 [a-zA-Z0-9_],這意味著它可以匹配:
- 任何單個字母(大寫或小寫),即
a到z和A到Z - 任何單個數(shù)字,即
0到9 - 下劃線
_
例如,在字符串 “Hello123” 中,\w 可以匹配每一個字符 “H”、“e”、“l”、“l”、“o”、“1”、“2” 和 “3”。
2.2、*
*
在正則表達式中,星號 * 是一個量詞,它表示其前一個字符(或字符組)可以出現(xiàn)任意次,包括0次。具體來說,如果在正則表達式中某個字符后面加上星號 *,那么這個字符可以不出現(xiàn),或者出現(xiàn)一次,或者多次。
例如:
a*匹配任何包含零個或多個 ‘a’ 的字符串,如:""(空字符串),"a","aa","aaa"等。ba*n匹配以 ‘b’ 開始,后跟零個或多個 ‘a’,最后是一個 ‘n’ 的字符串,如:"bn","ban","baan","baaan"等。
2.3、?
?
在正則表達式中,問號 ? 也是一個量詞,它表示其前一個字符(或字符組)可以出現(xiàn)0次或1次。換句話說,問號 ? 使得前一個字符變?yōu)榭蛇x的。
具體來說:
a?匹配包含零個或一個 ‘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、.
.
在正則表達式中,“.” 是一個特殊字符(元字符),它的意思是:
匹配除換行符以外的任意單個字符。
舉個例子來說明:
正則表達式:a.c
這個正則表達式表示:
- 匹配以
a開頭, - 中間有一個任意字符(但不能是換行符),
- 以
c結(jié)尾 的三個字符的字符串。
匹配結(jié)果:
abc?a2c?a c?(中間是空格)ac?(因為只有兩個字符,中間沒有字符)a c?(中間是換行符,.不匹配換行符)
補充說明:
- 如果你希望
.能匹配包括換行符在內(nèi)的所有字符,通常需要使用“單行模式”(也叫“點號匹配所有模式”),具體語法因語言而異。例如:- 在 Python 中使用
re.DOTALL標志; - 在 JavaScript 中使用
s修飾符(如/a.c/s); - 在 Java 中使用
Pattern.DOTALL。
- 在 Python 中使用
總結(jié):
| 字符 | 含義 |
|---|---|
. | 匹配任意一個字符(除換行符 ` |
| ` 以外) |
2.5、()
()
1. 單個括號()的作用(分組)
括號 () 在正則表達式中主要有以下幾個用途:
a.分組表達式
將多個字符或子表達式組合為一個整體,例如:
(ab)+
這個表達式匹配的是 ab 重復(fù)一次或多次,比如 ab, abab, ababab 等。
b.捕獲分組
括號可以捕獲匹配的內(nèi)容,并可以通過反向引用(如 \1, \2 等)來引用這些內(nèi)容。
例如:
(\d{3})-(\d{3}-\d{4})
這個正則可以匹配電話號碼如 123-456-7890,其中:
(\d{3})捕獲前三個數(shù)字;(\d{3}-\d{4})捕獲后面的數(shù)字部分;\1和\2可以引用這兩個分組的內(nèi)容。
2. “雙括號”(())的含義(即嵌套括號)
如果你看到的是 雙括號 (()),這表示的是嵌套的分組,比如:
((a)(b))
這個表達式匹配的是 ab,并將其分為兩個分組:
- 第一個括號
((a)(b))是整個分組; - 第二個括號
(a)是第一個分組內(nèi)的子分組; - 第三個括號
(b)也是第一個分組內(nèi)的另一個子分組。
這種結(jié)構(gòu)在反向引用中可能會用到,例如:
(\d{3})-(\d{3})-(\d{4})
可以寫成嵌套形式:
((\d{3})-(\d{3}))-(\d{4})
3. 非捕獲分組((?:...))
如果你只是想分組而不捕獲內(nèi)容(即不想保存匹配的內(nèi)容),可以使用非捕獲分組:
(?:abc)+
這個表達式匹配的是 abc 重復(fù)一次或多次,但不會保存每個匹配的內(nèi)容。
總結(jié)
| 表達式 | 說明 |
|---|---|
() | 捕獲分組,同時分組和保存匹配內(nèi)容 |
(()) | 嵌套分組,多個分組層級 |
(?:...) | 非捕獲分組,僅分組不保存 |
如果你看到的是 () 但不是嵌套的情況,那它就是普通的分組和捕獲操作。
到此這篇關(guān)于Java正則表達式匹配的文章就介紹到這了,更多相關(guān)Java正則表達式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BeanUtils.copyProperties使用總結(jié)以及注意事項說明
這篇文章主要介紹了BeanUtils.copyProperties使用總結(jié)以及注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot中Getmapping獲取參數(shù)的實現(xiàn)方式
這篇文章主要介紹了springboot中Getmapping獲取參數(shù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
springboot項目打包鏡像方式以及區(qū)分環(huán)境打包的方法
本文主要介紹了springboot項目打包鏡像方式以及區(qū)分環(huán)境打包的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03
如何實現(xiàn)自定義SpringBoot的Starter組件
這篇文章主要介紹了實現(xiàn)自定義SpringBoot的Starter組件的示例代碼,想要自定義starter組件,首先要了解springboot是如何加載starter的,也就是springboot的自動裝配機制原理,本文結(jié)合示例代碼詳細講解,需要的朋友可以參考下2023-02-02
eclipse部署tomcat服務(wù)器無法啟動問題的解決方法
這篇文章主要為大家詳細介紹了eclipse部署tomcat服務(wù)器無法啟動問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03

