java 正則(2) 空行匹配
阿新 • • 發佈:2019-02-02
java 正則 空白行
圖 1 寫入\r 或\n 的結果相同package test.java.RegExp; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Order { public static void main(String[] args) throws IOException { //6.空白行問題,呼叫下面寫檔案函式和檢視空行數函式 writeR(); System.out.println("檔案 d:/out.txt 空行數為"+staticWhileLine("d:/out.txt")); } //檢視檔案空白行數目的函式 public static int staticWhileLine(String fileName){ FileReader fr = null; String line = null; int count = 0; int total = 0; int temp = 0; //這三個正則 "\\s*" "\\s{0}"和 上來一行啥也不寫,直接換行是這個 "",用""正則表示式能把一行中啥也沒有匹配出來,\\s{1} 匹配不出來""這個空串,也就是""不在\s裡面 String regexContainN = "\\s*"; //單純的\n , \r 也能被匹配到 //匹配任意空白行的正則表示式,包含開頭就換行的(readLine()出來的結果是<span style="font-family: Arial, Helvetica, sans-serif;">"" </span><span style="font-family: Arial, Helvetica, sans-serif;">)</span> String regexNotN = "^[\\s&&[^\\n]]\\s*$"; //注意readline()出來的字串中沒有\n或\r,所以這個正則排除第一個字元是\n的字串,沒意義,因為readline() 出來的,根本不可能出現\n 開頭的字串。這個正則能匹配出開頭必須有\t 等東西的空白行字串,但是匹配不出來""這種行。 String regexForDigit = "\\d"; //這才是正則,故\\n 是正則,而\n 只是字串換行符 try { fr = new FileReader(new File(fileName)); BufferedReader br = new BufferedReader(fr); //////////////////////用單個字元的AUSCII碼匹配,能匹配出只含 \n 或\r 行的方法 ///////////////////////// // while((temp = br.read())!=-1 ){ //read 讀位元組,讀出來了檔案中的\r // System.out.println(temp);//是13,也就是\r的ausii 碼,0xD.如果寫檔案是,\n,則讀出來是10 ,0xA // total++; // if(temp==10) // 此處13代表 \r,10代表\n // { // count++; // System.out.println(line+total); //這個readLine方法底層呼叫的是Reader的read(char []) // } // } /////////////////任意空白行則用regexContainN 即\\s* 去匹配,如果不想包含""空串,可以用regexNotN 去匹配 //////////////// while((line = br.readLine())!=null ){ //readLine 這裡是讀取 \r 或者\n 之前的部分,不包括\r \n,所以這裡你用\\n 去匹配 line,匹配不出來什麼 total++; System.out.println(line);//是\r if(line.matches(regexContainN)) // { count++; System.out.println(line+total); //這個readLine方法底層呼叫的是Reader的read(char []) } } } catch (Exception e) { e.printStackTrace(); } return count;//空白行數為 } //這個函式是寫檔案,\r 或者\n, 這兩者效果相同,結果檔案如圖1 public static void writeR()throws IOException{ FileWriter bw = null ; try { bw = new FileWriter("D:/out.txt"); for(int i=0;i<50000;i++) //此處的i取後16位,2的16次方能表示65536個字元,所以此處寫50000都能顯示。這裡相當於我們把unicode大多數國家的字元都寫了進去 bw.write("\n");// 只寫\r是會在檔案中換行的 bw.close(); } catch (IOException e) { e.printStackTrace(); } } }