1. 程式人生 > >java 正則(2) 空行匹配

java 正則(2) 空行匹配

java 正則 空白行

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();
		}
	}
}
圖 1  寫入\r  或\n 的結果相同