java 正则表达式语法_Java 正则表达式基础语法
基礎符號
首尾匹配^:匹配輸入字符串開始的位置
$:匹配輸入字符串結尾的位置
例:"^hello$"含義為該字符串開頭必須為h,結尾必須為oprivate static void demo1() {
String content = "hello";
String pattern = "^hello$";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println(content + "與" + pattern + "是否匹配?" + isMatch);
}
匹配數量:*:0個或多個
+:一個或多個
?:0個或1個
{n}:n個
{n,}:n到無窮多個
{n,m}:n到m個
例:匹配0-6個hprivate static void demo2() {
String[] s = {"h", "hh", "hhh", "hhhh", "hhhhh", "hhhhhh"};
String[] p = {"h+", "h*", "h?", "h{3}", "h{3,}", "h{3,5}"};
for (String content : s) {
for (String pattern : p) {
boolean isMatch = Pattern.matches(pattern, content);
System.out.println(content + "\t與\t" + pattern + "\t是否匹配?\t" + isMatch);
}
}
}h+h*h?h{3}h{3,}h{3,5}空字符串011000
h111000
hh110000
hhh110111
hhhh110011
hhhhh110011
hhhhhh110010
捕獲方式:(pattern):()表示捕獲分組,()會把每個分組里的匹配的值保存起來,從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推
(?:pattern):表示非捕獲分組,和捕獲分組唯一的區別在于,非捕獲分組匹配的值不會保存起來
(?=pattern):正向肯定預查,匹配pattern前面的位置。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。
(?!pattern):正向否定預查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。
(?<=pattern):反向(look behind)肯定預查,與正向肯定預查類似,只是方向相反。
(?
方括號:
[xyz]:匹配x或y或z
[^xyz]:匹配除了x、y、z的其他字符
[a-z]:匹配小寫字母
轉義:\b\B:\b匹配一個字邊界,即字與空格間的位置。例如,"lo\b"匹配"hello"中的"ol",但不匹配"look"中的"lo"。\B反之。
\cx:\cx 匹配control + 控制字符\cI 匹配 control + I,等價于 \t,
\cJ匹配 control + J,等價于 \n,
\cM匹配 control + M,等價于 \r
\ca \cb \cc ... 又分別匹配 control+a, control+b,control+c....,看運行的程序而定
\d\D:\d匹配數字。\D匹配非數字
\f:匹配分頁符。等效于 \x0c 和 \cL。
\n:匹配換行符。等效于 \x0a 和 \cJ。
\r:匹配回車符。等效于 \x0d 和 \cM。
\s\S:\s匹配任何空白字符,包括空格、制表符、換頁符等。與 [ \f\n\r\t\v] 等效。
\t:制表符匹配。與 \x09 和 \cI 等效。cv
\v:匹配垂直制表符。與 \x0b 和 \cK 等效。
\w\W:\w匹配任何字類字符,包括下劃線。與"[A-Za-z0-9_]"等效。\W反之
捕獲組
從正則表達式左側開始,每出現一個左括號"("記做一個分組,分組編號從1開始。0代表整個表達式。而命名則在括號中加入?給其命名
比如對于時間字符串:2019-01-20,表達式如下:(?\\d{4})-(?(?\\d{2})-(?\\d{2}))
有4個左括號,所以有4個分組:編號名稱捕獲組匹配00(\d{4})-((\d{2})-(\d{2})) ? ?整體2019-01-20
1year(\d{4})2019
2md((\d{2})-(\d{2}))01-20
3month(\d{2})01
4date(\d{2})20
示例代碼:private static void demo5() {
Pattern p = Pattern.compile("(\\d{4})-((\\d{2})-(\\d{2}))");
Matcher m = p.matcher("2019-01-20");
m.find();
System.out.println("m.group(0) value: "+m.group(0));
System.out.println("m.group(1) value: "+m.group(1));
System.out.println("m.group(2) value: "+m.group(2));
System.out.println("m.group(3) value: "+m.group("month"));
System.out.println("m.group(4) value: "+m.group("date"));
}
//輸出:
//m.group(0) value: 2019-01-20
//m.group(1) value: 2019
//m.group(2) value: 01-20
//m.group(3) value: 01
//m.group(4) value: 20
Java常用類
Pattern 類:pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構造方法。要創建一個 Pattern 對象,你必須首先調用其公共靜態編譯方法,它返回一個 Pattern 對象。該方法接受一個正則表達式作為它的第一個參數。
Matcher 類:Matcher 對象是對輸入字符串進行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要調用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象。
PatternSyntaxException類:是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。
Matcher方法
索引方法序號方法說明1public int start()返回以前匹配的初始索引。
2public int start(int group)返回在以前的匹配操作期間,由給定組所捕獲的子序列的初始索引
3public int end()返回最后匹配字符之后的偏移量。
4public int end(int group)返回在以前的匹配操作期間,由給定組所捕獲子序列的最后字符之后的偏移量。
public class RegexMatches {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\bwen\\b");
Matcher m = p.matcher("wen wen wenXXX wen"); // 獲取 matcher 對象
int count = 0;
while (m.find()) {
count++;
System.out.print("第" + count+"個匹配值 ");
System.out.print("起始索引: " + m.start());
System.out.print(" 結束索引: " + m.end());
System.out.println();
}
}
private static void demo() {
Pattern p = Pattern.compile("(\\d{4})-((\\d{2})-(\\d{2}))");
Matcher m = p.matcher("2019-01-20");
m.find();
for(int i=0;i<5;i++){
System.out.println("第"+i+"個組"+"索引 "+m.start(i)+" 值:"+m.group(i));
}
}
}
main輸出:第1個匹配值 起始索引: 0 結束索引: 3
第2個匹配值 起始索引: 4 結束索引: 7
第3個匹配值 起始索引: 15 結束索引: 18
demo輸出:第0個組索引 0 值:2019-01-20
第1個組索引 0 值:2019
第2個組索引 5 值:01-20
第3個組索引 5 值:01
第4個組索引 8 值:20
查找方法序號方法說明1public boolean lookingAt()判斷開頭區域是否與正則表達式匹配。
2public boolean find()嘗試查找與該表達式匹配的輸入序列的下一個子序列。
3public boolean find(int start)重置此匹配器,然后嘗試查找匹配該模式、從指定索引開始的輸入序列的下一個子序列。
4public boolean matches()判斷整個區域是否與正則表達式匹配。
例:public class RegexMatches2 {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("foo");
Matcher matcher = pattern.matcher("fooooooooooooooooo");
Matcher matcher2 = pattern.matcher("ooooofoooooooooooo");
System.out.println("lookingAt(): " + matcher.lookingAt());
System.out.println("matches(): " + matcher.matches());
System.out.println("lookingAt(): " + matcher2.lookingAt());
}
}
輸出:lookingAt(): true
matches(): false
lookingAt(): false
替換方法序號方法說明1public Matcher appendReplacement(StringBuffer sb, String replacement)實現非終端添加和替換步驟。
2public StringBuffer appendTail(StringBuffer sb)實現終端添加和替換步驟。
3public String replaceAll(String replacement)替換模式與給定替換字符串相匹配的輸入序列的每個子序列。
4public String replaceFirst(String replacement)替換模式與給定替換字符串匹配的輸入序列的第一個子序列。
5public static String quoteReplacement(String s)返回指定字符串的字面替換字符串。這個方法返回一個字符串,就像傳遞給Matcher類的appendReplacement 方法一個字面字符串一樣工作。
replaceAll案例:private static void demo1() {
String dog = "I have a dog. The dog very cute.";
Pattern p = Pattern.compile("dog");
Matcher m = p.matcher(dog);
dog = m.replaceAll("cat");
System.out.println(dog);
}
輸出:I have a cat. The cat very cute.
replaceFirst案例:private static void demo2() {
String dog = "I have a dog. The dog very cute.";
Pattern p = Pattern.compile("dog");
Matcher m = p.matcher(dog);
dog = m.replaceFirst("cat");
System.out.println(dog);
}
輸出:I have a cat. The dog very cute.
appendReplacement 和 appendTail 方法private static void demo3() {
Pattern p = Pattern.compile("a*b");
// 獲取 matcher 對象
Matcher m = p.matcher("aabfooaabfooabfoobkkk");
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,"-");
System.out.println(sb.toString());
}
m.appendTail(sb);
System.out.println(sb.toString());
}
總結
以上是生活随笔為你收集整理的java 正则表达式语法_Java 正则表达式基础语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用java实现冒泡排序_Java实现冒泡
- 下一篇: java 获取进程_java获取指定进程