目錄
java.util.regex中的Match和Regex的方法
在lookingAt搜索之後使用hitEnd和requireEnd的例子
java.util.regex的正則流派
java.util.regex中的Match和Regex的方法
在lookingAt搜索之後使用hitEnd和requireEnd的例子
代碼示例
(自己在看本章時寫的代碼)
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @ClassName SimpleRegex * @Author zhangqx02 * @Date 2019/10/31 17:06 * @Description *《精通正則表達式》第八章Java * 簡短的匹配例子 */ public class SimpleRegex { public static void main(String[] args){ // simpleRegexTest(); // findURL(); replaceAll(); String metric = "Thre normal celsiurs is from 36.3C to 40.1C. And if"; celsiusToFahrenheit(metric); String text = "It's SO very RUDE to shuot!"; upperCaseToLowerCase(text); lengthChangeUpperCaseToLowerCase(text); transparentBounds(); } /** * 對正則表達式簡短的匹配例子 */ private static void simpleRegexTest(){ String myText = "this is my 1st test 2st string"; // String myRegex = "\\d+\\w+"; // 表示\d+\w+ String myRegex = "\\w+"; Pattern p = Pattern.compile(myRegex,Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);//不區分大小寫的匹配 Matcher m = p.matcher(myText); while (m.find()){ String matchedText = m.group(); int matchedFrom = m.start(); int matchedTo = m.end(); System.out.println("matched ["+matchedText+"]" + " from "+matchedFrom+ " to "+matchedTo); } // else { // System.out.println("didn't match!"); // } } /** * 給定一個URL字符串,找出URL的協議名('http'或是'https'),、主機名,以及可能出現的端口號 */ private static void findURL(){ String url = "http://regex.info/blog"; String regex = "(?x) ^(https?)://([^/:]+) (?:(\\d+))?"; Matcher m = Pattern.compile(regex).matcher(url); if (m.find()){ System.out.println("" + "Overall ["+m.group() +"]" + " (from "+m.start() +" to " +m.end() +" )\n" + "Protocol ["+m.group(1) +"]" + " (from "+m.start(1) +" to " +m.end(1) +")\n" + "Hostname ["+m.group(2) +"]" + " (from "+m.start(2) +" to " +m.end(2) +")\n" ); } //group(3)可能來參與匹配,此處應小心對待 if (m.group(3) == null){ System.out.println("Not port; default of '80' is assumed"); }else { System.out.println("Port is ["+m.group(3)+" ]" + " (from "+m.start(3) + " to "+m.end()+")\n"); } } /** * 簡單查找-替換的例子 */ private static void replaceAll(){ String text = "Before Java 1.5 was Java 1.4.2. After Java 1.5 was Java 1.6"; String regex = "\\bJava\\s*1\\.5\\b"; Matcher m = Pattern.compile(regex).matcher(text); String result = m.replaceAll("Java 5.0"); System.out.println(result); String result1 = Pattern.compile("\\bJava\\s*1\\.([56])\\b").matcher(text).replaceAll("Java $1.0"); System.out.println(result1); } /** * 查找-替換示範 * @param m * @param replacement * @return */ public static String replaceAll(Matcher m,String replacement){ m.reset();//保證Matcher不受之前的影響 StringBuffer result = new StringBuffer(); //用於替換生成的副本 while (m.find()){ m.appendReplacement(result,replacement); } m.appendTail(result); return result.toString();//轉換爲String,然後返回 } public static String replaceAllRegion(Matcher m,String replacement){ Integer start = m.regionStart(); Integer end = m.regionEnd(); m.reset().region(start,end);//重置matcher,之後恢復region StringBuffer result = new StringBuffer();//生成用於替換的副本 while (m.find()){ m.appendReplacement(result, replacement); } m.appendTail(result); return result.toString();//轉換爲String之後進行返回 } /** * 將metric變量中的攝氏溫度轉換爲華氏溫度 */ private static void celsiusToFahrenheit(String metric){ //構建一個matcher,匹配"Meteric"變量中後面跟有"C"的數值 //下面的正則表達式是:( \d+(?:\.\d*)?)C\b Matcher m = Pattern.compile("(\\d+(?:\\.\\d*)?)C\\b").matcher(metric); StringBuffer result = new StringBuffer(); while (m.find()){ float celsius = Float.parseFloat(m.group(1));//得到數值,轉化爲浮點數 int fathrenheit = (int)(celsius * 9 /5 +32); m.appendReplacement(result, fathrenheit+"F"); } m.appendTail(result); System.out.println(result.toString()); } /** * 在StringBuiler中搜索大寫單詞,將他們替換爲小寫形式 * @param text */ private static void upperCaseToLowerCase(String text){ StringBuilder builder = new StringBuilder(text); Matcher m = Pattern.compile("\\b[\\p{Lu}\\p{Lt}]+\\b").matcher(builder); while (m.find()){ builder.replace(m.start(),m.end(),m.group().toLowerCase()); } System.out.println(builder); } /** * 長度變化的替換 * @param text */ private static void lengthChangeUpperCaseToLowerCase(String text){ StringBuilder builder = new StringBuilder(text); Matcher m =Pattern.compile("\\b[\\p{Lu}\\p{Lt}]+\\b").matcher(builder); int matchPointer = 0 ; while (m.find()){ matchPointer = m.end(); builder.replace(m.start(),m.end(),"<b>"+m.group().toLowerCase()+"</b>"); matchPointer+=7; } System.out.println(builder); } private static void transparentBounds(){ String regex = "\\bcar\\b"; String text = "Madagascar is best seen by car or bike!"; Matcher m = Pattern.compile(regex).matcher(text); m.region(7,text.length()); m.useTransparentBounds(true); m.find(); System.out.println("Matches starting at character "+m.start()); } }