Java正則表達式通過(guò)java.util.regex包下的Pattern和Matcher類(lèi)實(shí)現
Pattern類(lèi)用于創(chuàng )建一個(gè)正則表達式,也可以說(shuō)是創(chuàng )建一個(gè)匹配模式,可以通過(guò)兩個(gè)靜態(tài)方法創(chuàng )建:compile(String regex)和compile(String regex,int flags),其中regex是正則表達式,flags為可選模式(如:Pattern.CASE_INSENSITIVE 忽略大小寫(xiě))
實(shí)例:
Pattern pattern = Pattern.compile("Java");System.out.println(pattern.pattern());//返回此模式的正則表達式即JavaPattern類(lèi)還有兩個(gè)根據匹配模式拆分輸入序列的方法:split(CharSequence input) 和split(CharSequence input, int limit),其中limit為返回元素的個(gè)數。
實(shí)例:
Pattern pattern = Pattern.compile("Java");String test="123Java456Java789Java";String[] result = pattern.split(test);for(String s : result) System.out.println(s);結果:
在細說(shuō)一下split(CharSequence input, int limit),當limit值大于所能返回的字符串的最多個(gè)數或者為負數,返回的字符串個(gè)數將不受限制,但結尾可能包含空串,而當limit=0時(shí)與split(CharSequence input)等價(jià),但結尾的空串會(huì )被丟棄。
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);運行結果:
Pattern類(lèi)也自帶一個(gè)靜態(tài)匹配方法matches(String regex, CharSequence input),但只能進(jìn)行全字符串匹配并且只能返回是否匹配上的boolean值
實(shí)例:
String test1 = "Java";String test2 = "Java123456";System.out.println(Pattern.matches("Java",test1));//返回trueSystem.out.println(Pattern.matches("Java",test2));//返回false最后就要過(guò)渡到Matcher類(lèi)了,Pattern類(lèi)中的matcher(CharSequence input)會(huì )返回一個(gè)Matcher對象。
Matcher類(lèi)提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持,要想得到更豐富的正則匹配操作,那就需要將Pattern與Matcher聯(lián)合使用。
實(shí)例:
Pattern pattern = Pattern.compile("Java");String test = "123Java456Java789Java";Matcher matcher = pattern.matcher();Matcher類(lèi)提供了三個(gè)返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用于全字符串匹配,lookingAt從字符串最開(kāi)頭開(kāi)始匹配滿(mǎn)足的子串,find可以對任意位置字符串匹配,其中start為起始查找索引值。
實(shí)例
Pattern pattern = Pattern.compile("Java");String test1 = "Java";String test2 = "Java1234";String test3 = "1234Java"Matcher matcher = pattern.matcher(test1);System.out.println(matcher.matches());//返回truematcher = pattern.matcher(test2);System.out.println(matcher.matches());//返回falsematcher = pattern.matcher(test2);System.out.println(matcher.lookingAt())://返回truematcher = pattern.matcher(test3);System.out.println(matcher.lookingAt());//返回falsematcher = pattern.matcher(test1);System.out.println(matcher.find());//返回truematcher = pattern.matcher(test2);System.out.println(matcher.find());//返回truematcher = pattern.matcher(test3);System.out.println(matcher.find(2));//返回truematcher = pattern.matcher(test3);System.out.println(matcher.find(5));//返回false這里介紹下組的概念:組是用括號劃分的正則表達式,可以根據組的編號來(lái)引用這個(gè)組。組號為0表示整個(gè)表達式,組號為1表示被第一對括號括起的組,依次類(lèi)推,例如A(B(C))D,組0是ABCD,組1是BC,組2是C。
Matcher類(lèi)提供了start(),end(),group()分別用于返回字符串的起始索引,結束索引,以及匹配到到的字符串。
實(shí)例:
Pattern pattern = Pattern.compile("Java");String test = "123Java456";Matcher matcher = pattern.matcher(test);matcher.find();System.out.println(matcher.start());//返回3System.out.println(matcher.end());//返回7System.out.println(matcher.group());//返回JavaMatcher類(lèi)提供了start(int gropu),end(int group),group(int i),groupCount()用于分組操作
實(shí)例:
Pattern pattern = Pattern.compile("(Java)(Python)");String test = "123JavaPython456";Matcher matcher = pattern.matcher(test);matcher.find();System.out.println(matcher.groupCount());//返回2System.out.println(matcher.group(1));//返回第一組匹配到的字符串"Java",注意起始索引是1System.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類(lèi)還提供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());//返回JavaMatcher類(lèi)提供了兩種用于重置當前匹配器的方法: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最后說(shuō)一下Matcher類(lèi)的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替換全部匹配到的字符串,而replaceFirst僅僅是替換第一個(gè)匹配到的字符串。
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還有兩個(gè)方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允許直接將匹配的字符串保存在另一個(gè)StringBuffer中并且是漸進(jìn)式匹配,并不是只匹配依次或匹配全部,而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聯(lián)系客服