javase 정규 표현 식 입문

j2se 의 중요 한 부분 인 정규 표현 식 은 매우 강력 합 니 다.문자열 을 처리 할 때 강력 합 니 다.주로 java.util.regex 패키지 의 Pattern 클래스 와 Matcher 클래스 와 관련 이 있 습 니 다.
다음은 코드 에서 정규 표현 식 으로 들 어 갑 니 다.
코드 세 션 1,입문 단계:
	private static void testRegExpAccidence() {
		//          , .          。        true。match(...)  ,         .
		sop("abc".matches("..."));
		
		//     2,reaplaceAll        , \\d      ,           &。
		sop("abc1234abc".replaceAll("\\d","&"));
		
		//     3,compile   。             Pattern, Pattern     ,    compile  
		Pattern pat = Pattern.compile("[abc]{3}");
		Matcher mat = pat.matcher("abc"); //       Pattern       ,            Matcher  
		sop(mat.matches());//        "abc".matches("[abc]{3}")       ,    [abc]{3}     
		
		sop("------------. * + ?   --------------------");
		//  . * + ?   。
		sop("a".matches(".")); //.      
		sop("aaaa".matches("a*")); //X*   X  0    
		sop("aaaa".matches("a+")); //X+   X  1    
		sop("aaaa".matches("a?"));//false  //X?   X  1  0 
		sop("".matches("a*"));
		sop("".matches("a+")); //false
		sop("".matches("a?"));
		sop("a".matches("a*"));
		sop("a".matches("a+"));
		sop("a".matches("a?"));
		sop("2343902594".matches("\\d{3,100}")); // \\d      {3,100}      3 ,    100 
		sop("192.168.0.aaa".matches("\\d{3}\\.\\d{3}\\.\\d{3}\\.\\d{3}")); //false,        true
		sop("192".matches("[0-2][0-9][0-9]"));
		
		sop("---------------     ------------------------");
		sop("a".matches("[abc]")); //true,[abc]  ,  a  b  c,          
		sop("a".matches("[^abc]")); //false, [^abc]  ,   a b c,            
		sop("A".matches("[a-zA-Z]")); //true   [a-zA-Z]   a-z A-Z      
		sop("A".matches("[a-z]|[A-Z]"));//true,  [a-z]|[A-Z]    a-z A-Z      
		sop("A".matches("[a-z[A-Z]]"));//true,  [a-z[A-Z]]    a-z A-Z      
		sop("R".matches("[A-Z&&[RFG]]"));//true   [A-Z&&[RFG]]   A-Z RFG      RFG      
		
		sop("---------------     s、   w、   d、   ------------------------");
		//\s \w \d \  \s     \w      (a-z0-9_A-Z) \d     
		// \         , \t\r
, \, \\。 sop("
\r\t".matches("\\s{4}")); //\s, \\s, 。 sop(" ".matches("\\S")); // \S, \s , ( )。 \D false。 sop("a_8".matches("\\w{3}")); // \\w ,{3} 。 true 。 //sop("\\".matches("\\")); // , matches , java \\ , // , java , 。 sop("\\".matches("\\\\")); sop("--------------- boundary ^ $ \\b------------------------"); sop("hello sir".matches("^h.*")); //^ [] , , h sop("hello sir".matches(".*ir$")); //$ , ir // \\b , \t \r
。 sop("hello sir".matches("^h[a-z]{1,3}o\\b.*")); // . , ,1 。 sop("hellosir".matches("^h[a-z]{1,3}o\\b*")); // false 。 sop("--------- ------------"); sop("aaa 8888c".matches(".*\\d{4}.")); // true, .* 0 sop("aaa 8888c".matches(".*\\b\\d{4}.")); // true, .* 0 sop("aaa8888c".matches(".*\\d{4}.")); sop("aaa8888c".matches(".*\\b\\d{4}."));// false , \\b , \d{4} 。 sop("[email protected]".matches("\\w+@\\w+\\.\\w+")); // , @ . - 。 sop("[email protected]".matches("[\\w.-]+@[\\w.-]+\\.\\w+")); }

코드 세 션 2:Matcher 류 의 find,start,end,lookingAt 방법 을 파악 합 니 다.
	private static void testFindAndLookingAt() {
		sop("---------------------matcher.find   matcher.lookingAt match.reset     --------------------------");
		Pattern p = Pattern.compile("\\d{3,5}");
		Matcher match = p.matcher("234-32132-4321-00");
		sop(match.matches()); //matches   find           ,                     。
		match.reset();       //      reset       ,matches        false,      4        
		sop(match.find());   //  ,      find 32132    ,     。(     reset  )。            false 。
		sop(match.start()+"--"+match.end()); //   find     true ,  start              ,     0,      3(3    )
		sop(match.find());
		sop(match.start()+"--"+match.end()); // start    4,end  9 。
		sop(match.find());
		sop(match.start()+"--"+match.end());
		sop(match.find());
		//sop(match.start()+"--"+match.end()); //    ,     。     find    false,      。  start end  
		                                    //  IllegalStateException: No match available
		
		sop(match.lookingAt()); //    lookingAt      true,  lookingAt             。
		sop(match.lookingAt());
	}

 
코드 세 션 3:강력 한 replace,replace All,append Replacement 방법 파악
	private static void testReplacement() {
		sop("---------------------------match.replece        ---------------------");
		//CASE_INSENSITIVE              Pattern.CANON_EQ              
		Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);  
		//            java    。           java
		Matcher match = p.matcher("Java java JAva JAVa ILOVEJAVA youhateJaVa asdfasl;kdfj");
		//sop(match.replaceAll("SOP"));  //   java     SOP,     java     。
		//       ,       java     ,   SOP,         HELP。    while  find  
		
		int count = 0;
		StringBuffer buf = new StringBuffer();  //      StringBuilder,  matcher        Builder
		while(match.find()){
			if(0 == count++%2){
				match.appendReplacement(buf, "HELP");
			}else{
				match.appendReplacement(buf, "SOP");
			}
		}
		sop(match.appendTail(buf)); //     find    asdf        。
	}

 
코드 세 션 4:url 에서 메 일 주 소 를 캡 처 합 니 다:
/**
	 *       ,  http  ,                ,    e-mail  。
	 */
	private static void testUrlFetchEmail() throws Exception {
		sop("----------------- URL         ,          e-mail    ----------------------");
		//http://dzh.mop.com/whbm/20060220/3/S7gSlI706d198a73.shtml
		URL url = new URL("http://dzh.mop.com/whbm/20060220/3/S7gSlI706d198a73.shtml");
		sop(url.getContent());
		sop(url.getQuery());
		InputStream is = url.openStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
		Pattern p = Pattern.compile("([\\w.-]+)@([\\w.-]+)\\.\\w+");
		//Pattern p = Pattern.compile("^([\\w.-]+)@([\\w.-]+)\\.\\w+"); //   ^      ,             
		String line = null;  // URL        ,           ,    <br> <P> <dir>   ,         。
		while((line=br.readLine())!=null){
			Matcher ma = p.matcher(line);
			while(ma.find()){  //group   find     。   :java.lang.IllegalStateException: No match found
				sop(ma.group()+"      :"+ma.group(1)+",      :"+ma.group(2));
			}
			//sop(line);
			//java.lang.IllegalStateException: No match found
		}
	}

 
코드 세 션 5:코드 줄 통계
	/**
	 *         ,     .java           。
	 * @param dir               。    D:\test   (         )     
	 * @throws Exception
	 */
	private static void parseDirCodeNum(File dir) throws Exception{
		File[] files = dir.listFiles(new FilenameFilter(){
			@Override
			public boolean accept(File dir, String name) {
				File tempFile = new File(dir,name);
				if(tempFile.isFile()){  //         ,       .java   ,    true,      
					if(name.endsWith(".java")){
						return true ;
					}else{
						return false;
					}
				}
				return true;
			}
		});
		
		for(File f : files){
			if(f.isDirectory()){
				parseDirCodeNum(f);
			}else{
				parseFileDirNum(f);  //   java          
			}
		}
	}
	/**
	 *         。
	 * @param f
	 * @throws Exception
	 */
	private static void parseFileDirNum(File f) throws Exception{
		BufferedReader br = new BufferedReader(new FileReader(f));
		boolean isComment = false ;
		String line = null ;
		while((line = br.readLine())!=null){
			line = line.trim();  //               ,           \t  stratsStart
			if(line.startsWith("/*")&&line.endsWith("*/")){ //      
				commentLine++;
			}else if(line.startsWith("/*")){ //          ,       isComment   ,true 。
				commentLine++;
				isComment = true;
			}else if(isComment){ //       ,    false        。        */ ,     。
				commentLine++;
				if(line.endsWith("*/")){  //      ,     ,    */ 。
					isComment = false;
				}
			}else if(line.startsWith("//")){
				commentLine++;
			}
			else if(line.matches("^[\\s&&[^\
]]*$")){ // , whitespaceLine++; }else { normalLine++; } } }

 
코드 세 션 6:Greedy Reluctant Possessive 수량 단어의 차 이 를 파악 합 니 다.
/**
	 *   Greedy Reluctant Possessive   
	 * Greedy          ,       ,        ,        ...
	 * Reluctant        。    ,      ,         ,       ...
	 * Possessive  
	 */
	private static void testGreedyReluctantPossessive() {
		sop("-------------   Greedy Reluctant Possessive   -----------------------");
		Pattern gp = Pattern.compile(".{3,10}[0-9]");  //Greedy  
		Pattern rp = Pattern.compile(".{3,10}?[0-9]");  //Reluctant        Greedy       ?
		Pattern pp = Pattern.compile(".{3,10}+[0-9]");  //Possessive       Greedy       +
		Matcher gm = gp.matcher("asdf8sdfa9"); //  Greedy        
		Matcher rm = rp.matcher("asdf8sdfa9"); //  Reluctant        
		Matcher pm = pp.matcher("asdf8sdfa9"); //  Possessive        
		
		if(gm.find()){  //  gm     10                   ,         。
			sop(gm.start()+"  "+gm.end()); //  0  10
		}else{
			sop("      ");
		}
		
		if(rm.find()){ //  rm     3          ,      ,         。
			sop(rm.start()+"  "+rm.end()); //  0  5
		}else{
			sop("      ");
		}
		
		if(pm.find()){ //  pm      10 ,            ,      (     ,       )。    。
			sop(pm.start()+"  "+pm.end());
		}else{
			sop("      ");  //     
		}
		
		
	}

코드 세 션 7 관련 테스트 코드:
        private static long normalLine ;
	private static long commentLine ;
	private static long whitespaceLine ;
	
	public static void main(String[] args) throws Exception{
		testRegExpAccidence();
		testFindAndLookingAt();
		testReplacement();
		
		sop("-----------------match.group        --------");
		Pattern p = Pattern.compile("([\\w.-]+)@([\\w.-]+)\\.\\w+");
		Matcher m = p.matcher("[email protected]");
		while(m.find()){
			sop(m.group());
			sop(m.group(1)); //       -chenshufei2
			sop(m.group(2)); //        sina 
			//sop(m.group(3));       java.lang.IndexOutOfBoundsException: No group 3
			//        ,           (     ,         (,      。
		}
		
		//testUrlFetchEmail(); //D:/java_setup_program_file/eclipse/design_pattern/EnhanceJava
		String dirStr = "D:\\360Rec";
		File dir = new File(dirStr);
		parseDirCodeNum(dir);
		sop("     ,  normalLine::"+normalLine+"  ,commentLine::"+commentLine+"  ,whitespaceLine::"+whitespaceLine);
		
		
		testGreedyReluctantPossessive();
	}
public static void sop(Object obj){
		System.out.println(obj);
	}

좋은 웹페이지 즐겨찾기