Java正則表達式通過java.util.regex包下的Pattern和Matcher類實現
Pattern類用於創建一個正則表達式,也可以說是創建一個匹配模式,可以通過兩個靜態方法創建:compile(String regex)和compile(String regex,int flags),其中regex是正則表達式,flags為可選模式(如:Pattern.CASE_INSENSITIVE 忽略大小寫)
實例:
Pattern pattern = Pattern.compile("Java"); System.out.println(pattern.pattern());//返回此模式的正則表達式即Java
Pattern類還有兩個根據匹配模式拆分輸入序列的方法:split(CharSequence input) 和split(CharSequence input, int limit),其中limit為返回元素的個數。
實例:
Pattern pattern = Pattern.compile("Java"); String test="123Java456Java789Java"; String[] result = pattern.split(test); for(String s : result) System.out.println(s);
結果:
123 456 789
再細說一下split(CharSequence input, int limit),當limit值大於所能返回的字符串的最多個數或者為負數,返回的字符串個數將不受限制,但結尾可能包含空串,而當limit=0時與split(CharSequence input)等價,但結尾的空串會被丟棄。
Pattern pattern = Pattern.compile("Java"); String test = "123Java456Java789Java"; String[] result = pattern.split(test,2); for(String s : result) System.out.println(s); result = pattern.split(test,10); System.out.println(result.length); result = pattern.split(test,-2); System.out.println(result.length); result = pattern.split(test,0); System.out.println(result.length);
運行結果:
123
456Java789Java
4
4
3
Pattern類也自帶一個靜態匹配方法matches(String regex, CharSequence input),但只能進行全字符串匹配並且只能返回是否匹配上的boolean值
實例:
String test1 = "Java"; String test2 = "Java123456"; System.out.println(Pattern.matches("Java",test1));//返回true System.out.println(Pattern.matches("Java",test2));//返回false
最后就要過渡到Matcher類了,Pattern類中的matcher(CharSequence input)會返回一個Matcher對象。
Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持,要想得到更豐富的正則匹配操作,那就需要將Pattern與Matcher聯合使用。
實例:
Pattern pattern = Pattern.compile("Java"); String test = "123Java456Java789Java"; Matcher matcher = pattern.matcher();
Matcher類提供了三個返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用於全字符串匹配,lookingAt從字符串最開頭開始匹配滿足的子串,find可以對任意位置字符串匹配,其中start為起始查找索引值。
實例
Pattern pattern = Pattern.compile("Java"); String test1 = "Java"; String test2 = "Java1234"; String test3 = "1234Java" Matcher matcher = pattern.matcher(test1); System.out.println(matcher.matches());//返回true matcher = pattern.matcher(test2); System.out.println(matcher.matches());//返回false matcher = pattern.matcher(test2); System.out.println(matcher.lookingAt())://返回true matcher = pattern.matcher(test3); System.out.println(matcher.lookingAt());//返回false matcher = pattern.matcher(test1); System.out.println(matcher.find());//返回true matcher = pattern.matcher(test2); System.out.println(matcher.find());//返回true matcher = pattern.matcher(test3); System.out.println(matcher.find(2));//返回true matcher = pattern.matcher(test3); System.out.println(matcher.find(5));//返回false
這里介紹下組的概念:組是用括號划分的正則表達式,可以根據組的編號來引用這個組。組號為0表示整個表達式,組號為1表示被第一對括號括起的組,依次類推,例如A(B(C))D,組0是ABCD,組1是BC,組2是C。
Matcher類提供了start(),end(),group()分別用於返回字符串的起始索引,結束索引,以及匹配到到的字符串。
實例:
Pattern pattern = Pattern.compile("Java"); String test = "123Java456"; Matcher matcher = pattern.matcher(test); matcher.find(); System.out.println(matcher.start());//返回3 System.out.println(matcher.end());//返回7 System.out.println(matcher.group());//返回Java
Matcher類提供了start(int gropu),end(int group),group(int i),groupCount()用於分組操作
實例:
Pattern pattern = Pattern.compile("(Java)(Python)"); String test = "123JavaPython456"; Matcher matcher = pattern.matcher(test); matcher.find(); System.out.println(matcher.groupCount());//返回2 System.out.println(matcher.group(1));//返回第一組匹配到的字符串"Java",注意起始索引是1 System.out.println(matcher.start(1));//返回3,第一組起始索引 System.out.println(matcher.end(1));//返回7 第一組結束索引 System.out.println(matcher.group(2));//返回第二組匹配到的字符串"Python" System.out.println(matcher.start(2));//返回7,第二組起始索引 System.out.println(matcher.end(2));//返回13 第二組結束索引
Matcher類還提供region(int start, int end)(不包括end)方法用於設定查找范圍,並提供regionStrat()和regionEnd()用於返回起始和結束查找的索引
Pattern pattern = Pattern.compile("Java"); String test = "123JavaJava"; Matcher matcher = pattern.matcher(test); matcher.region(7, 11); System.out.println(matcher.regionStart());//返回7 System.out.println(matcher.regionEnd());//返回11 matcher.find(); System.out.println(matcher.group());//返回Java
Matcher類提供了兩種用於重置當前匹配器的方法:reset()和reset(CharSequence input)
Pattern pattern = Pattern.compile("Java"); String test = "Java"; Matcher matcher = pattern.matcher(test); matcher.find(); System.out.println(matcher.group());//返回Java matcher.reset();//從起始位置重新匹配 matcher.find(); System.out.println(matcher.group());//返回Java matcher.reset("Python"); System.out.println(matcher.find());//返回false
最后說一下Matcher類的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替換全部匹配到的字符串,而replaceFirst僅僅是替換第一個匹配到的字符串。
Pattern pattern = Pattern.compile("Java"); String test = "JavaJava"; Matcher matcher = pattern.matcher(test); System.out.println(matcher.replaceAll("Python"));//返回PythonPython System.out.println(matcher.replaceFirst("python"));//返回PythonJava
還有兩個方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允許直接將匹配的字符串保存在另一個StringBuffer中並且是漸進式匹配,並不是只匹配依次或匹配全部,而appendTail則是將未匹配到的余下的字符串添加到StringBuffer中。
Pattern pattern = Pattern.compile("Java"); Matcher matcher = pattern.matcher("Java1234"); System.out.println(matcher.find());//返回true StringBuffer sb = new StringBuffer(); matcher.appendReplacement(sb, "Python"); System.out.println(sb);//輸出Python matcher.appendTail(sb); System.out.println(sb);//輸出Python1234
---------------------
摘抄學習,出處如下:
作者:Java.Sheng
來源:CSDN
原文:https://blog.csdn.net/woaigaolaoshi/article/details/50970527