Java 정규 표현식 상세 설명

9156 단어 Java정규 표현식
모두가 알다시피 프로그램 개발에서 일치, 찾기, 교체, 판단 문자열이 필요한 상황에 직면하게 될 것이다. 이런 상황은 때때로 비교적 복잡하다. 만약에 순수한 인코딩 방식으로 해결한다면 종종 프로그래머의 시간과 정력을 낭비하게 될 것이다.따라서 정규 표현식을 배우고 사용하는 것이 이 모순을 해결하는 주요 수단이 되었다.
모두 알다시피 정규 표현식은 패턴 일치와 교체에 사용할 수 있는 규범이다. 정규 표현식은 일반적인 문자(예를 들어 문자 a에서 z까지)와 특수 문자(원 문자)로 구성된 문자 모델로 문자 주체를 찾을 때 일치할 문자열을 설명하는 데 사용된다.정규 표현식은 검색된 문자열과 일치하는 문자 모드를 템플릿으로 합니다.
jdk1.4에서java를 내놓은 이후.util.regex 패키지는 우리에게 좋은 JAVA 정규 표현식 응용 플랫폼을 제공합니다.
정규 표현식은 매우 난잡한 체계이기 때문에 저는 단지 입문의 개념을 예로 들었을 뿐입니다. 더 많은 것은 관련 서적을 참고하고 스스로 모색하십시오.
//백슬래시
/t 간격('/u0009')
/n 줄 바꿈('/u000A')
/r 리턴('/u000D')
/d 숫자는 [0-9]와 같다.
/D 비숫자는 [^0-9]와 같습니다.
/s 공백 기호 [/t/n/x0B/f/r]
/S 비공백 기호 [^/t/n/x0B/f/r]
/w 개별 문자 [a-zA-Z_0-9]
/W 비개별 문자 [^a-zA-Z_0-9]
/f 페이지 바꾸기
/e Escape
/b 단어의 경계
/B 단어가 아닌 경계
/G 이전 일치 끝
^ 제한 시작
^java 조건은 Java로 시작하는 문자로 제한됨
제한된 끝
java$조건은 java를 끝으로 제한합니다
.조건 제한/n 이외의 개별 문자
java..조건은 자바로 제한된 후 줄 바꿈 외에 임의의 두 문자로 제한됩니다
특정 제한 조건 가입 "[]"
[a-z] 조건은 소문자 a to z 범위에서 한 문자로 제한됩니다.
[A-Z] 조건은 대문자 A to Z 범위에 한 글자로 제한됩니다.
[a-zA-Z] 조건은 소문자 a to z 또는 대문자 A to Z 범위에 한 글자로 제한됩니다.
[0-9] 조건은 소문자 0 ~ 9 범위에 한 글자로 제한됩니다.
[0-9a-z] 조건은 소문자 0 ~ 9 또는 a to z 범위에서 한 문자로 제한됩니다.
[0-9[a-z]] 조건은 소문자 0 to 9 또는 a to z 범위에서 문자(교차)로 제한됩니다.
[]에 ^ 추가 후 제한 조건 "[^]"추가
[^a-z] 조건은 소문자 a to z 범위가 아닌 문자로 제한됩니다.
[^A-Z] 조건은 대문자 A to Z 이외의 문자로 제한됩니다.
[^a-zA-Z] 조건은 소문자 a to z 또는 대문자 A to Z 범위에서 한 글자로 제한됩니다.
[^0-9] 비소문자 0 to 9 범위에서 한 문자로 제한
[^0-9a-z] 조건은 비소문자 0 to 9 또는 a to z 범위에서 한 문자로 제한됩니다.
[^0-9[a-z]] 조건은 비소문자 0 to 9 또는 a to z 범위에서 문자(교집합)로 제한됩니다.
제한 조건이 특정 문자에 0번 이상 나타나면 "*"를 사용할 수 있습니다.
J* 0개 이상 J
.*0자 이상 임의의 문자
J.*D J와 D 사이의 0자 이상의 문자
제한 조건이 특정 문자로 1회 이상 나타나면 + 를 사용할 수 있습니다.
J+ 1개 이상 J.
.+1자 이상 임의의 문자
J+D J와 D 사이의 문자
제한 조건이 특정 문자에 대해 0 또는 1회 이상 나타나면 "?"를 사용할 수 있습니다.
JA?제이나 제이가 나타나요.
지정된 횟수 문자가 연속으로 표시되도록 제한 "{a}"
J{2}     JJ
J{3}     JJJ
문자 a개 이상, 그리고 "{a,}"
J{3,}     JJJ,JJJJ,JJJJJ,???(3회 이상 J 병존)
문자 개 이상, b개 이하 "{a, b}"
J{3,5} JJJ 또는 JJJJ 또는 JJJJ
둘 중 하나를 "|"
J|A J 또는 A
Java|Hello Java 또는 Hello
 
()에서 조합 유형 지정
예를 들어 나는 index에서 간의 데이터를 조회하여 (.+?)
Pattern을 사용하고 있습니다.compile 함수 시 정규 표현식의 일치 동작을 제어하는 매개 변수를 추가할 수 있습니다.
Pattern Pattern.compile(String regex, int flag)
flag의 범위는 다음과 같습니다.
Pattern.CANON_EQ는 두 문자의'정규 분해 (canonical decomposition)'가 완전히 같은 경우에만 일치한다고 인정합니다.예를 들어 이 로고를 사용하면 표현식'a/u030A'가'?'와 일치합니다.기본적으로'규범 상등성 (canonical equivalence)'을 고려하지 않습니다.
Pattern.CASE_INSENSITIVE (?) 는 기본적으로 대소문자 불일치는 US-ASCII 문자 세트에만 적용됩니다.이 로고는 표현식으로 하여금 대소문자를 무시하고 일치하게 할 수 있다.유니코드 문자를 크기 불일치시키려면 UNICODE_케이스와 이 로고를 합치면 됩니다.
Pattern.COMMENTS (?) 는 이 모드에서 일치할 때 (정규 표현식의) 공백 문자를 무시합니다. (역자 주석: 표현식의 "//s"가 아니라 표현식의 공백,tab, 리턴 등)메모는 # 에서 시작하여 이 행이 끝날 때까지 계속됩니다.내장형 플래그를 사용하여 Unix 행 모드를 활성화할 수 있습니다.
Pattern.DOTALL(?s) 모드에서 표현식 "."한 줄을 나타내는 끝 문자를 포함하여 모든 문자를 일치시킬 수 있습니다.기본적으로 표현식'.'행의 끝 문자가 일치하지 않습니다.
Pattern.MULTILINE
(?)m) 이 모드에서'^'와'$'는 각각 한 줄의 시작과 끝을 일치합니다.또한'^'는 문자열의 시작과 일치하고,'$'도 문자열의 끝과 일치합니다.기본적으로 이 두 표현식은 문자열의 시작과 끝만 일치합니다.
Pattern.UNICODE_CASE
(?u) 이 모드에서 CASE_를 사용하면INSENSITIVE 로고는 유니코드 문자에 대한 대소문자 불일치를 표시합니다.기본적으로 대소문자가 민감하지 않은 일치는 US-ASCII 문자 세트에만 적용됩니다.
Pattern.UNIX_LINES(?)는 이 모드에서'/n'만이 한 줄의 중단으로 인식되고,'.','^'와'$'와 일치합니다.
공허한 개념을 버리고 다음은 몇 가지 간단한 Java 정규 용례를 쓰십시오.
◆ 예를 들어 문자열이 검증을 포함할 때

// Java , 
 Pattern pattern = Pattern.compile("^Java.*");
 Matcher matcher = pattern.matcher("Java ");
 boolean b= matcher.matches();
 // , true, false
 System.out.println(b);

◆ 문자열을 여러 조건으로 분할할 때

Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
 System.out.println(strs[i]);
} 

◆ 문자 바꾸기(첫 문자)

Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher("  Hello World,  Hello World");
// 
System.out.println(matcher.replaceFirst("Java"));
◆ 문자 바꾸기(모두)

Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher("  Hello World,  Hello World");
// 
System.out.println(matcher.replaceAll("Java"));
◆ 문자 바꾸기(문자 바꾸기)

Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher("  Hello World,  Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
 matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
◆ 메일 주소 확인

String str="[email protected]";
Pattern pattern = Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());

◆ html 표시 제거

Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=/"index.html/"> </a>");
String string = matcher.replaceAll("");
System.out.println(string);
◆ html에서 대응하는 조건 문자열 찾기

Pattern pattern = Pattern.compile("href=/"(.+?)/"");
Matcher matcher = pattern.matcher("<a href=/"index.html/"> </a>");
if(matcher.find())
 System.out.println(matcher.group(1));
}
◆ http://주소 캡처

// url
Pattern pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){    
 buffer.append(matcher.group());  
 buffer.append("/r/n");    
System.out.println(buffer.toString());
}
◆ 지정된 텍스트 바꾸기 {}

String str = "Java {0} -{1} ";
String[][] object={new String[]{"//{0//}","1995"},new String[]{"//{1//}","2007"}};
System.out.println(replace(str,object));

public static String replace(final String sourceString,Object[] object) {
   String temp=sourceString; 
   for(int i=0;i<object.length;i++){
      String[] result=(String[])object[i];
    Pattern pattern = Pattern.compile(result[0]);
    Matcher matcher = pattern.matcher(temp);
    temp=matcher.replaceAll(result[1]);
   }
   return temp;
}

◆ 지정된 디렉토리 아래 파일을 정규 조건으로 조회

 // 
  private ArrayList files = new ArrayList();
  // 
  private String _path;
  // 
  private String _regexp;
  
  class MyFileFilter implements FileFilter {

    /**
    *  
    */
    public boolean accept(File file) {
    try {
     Pattern pattern = Pattern.compile(_regexp);
     Matcher match = pattern.matcher(file.getName());    
     return match.matches();
    } catch (Exception e) {
     return true;
    }
    }
   }
  
  /**
   *  
   * @param inputs
   */
  FilesAnalyze (String path,String regexp){
   getFileName(path,regexp);
  }
  
  /**
   *  files
   * @param input
   */
  private void getFileName(String path,String regexp) {
   // 
    _path=path;
    _regexp=regexp;
    File directory = new File(_path);
    File[] filesFile = directory.listFiles(new MyFileFilter());
    if (filesFile == null) return;
    for (int j = 0; j < filesFile.length; j++) {
    files.add(filesFile[j]);
    }
    return;
   }
 
  /**
   *  
   * @param out
   */
  public void print (PrintStream out) {
   Iterator elements = files.iterator();
   while (elements.hasNext()) {
    File file=(File) elements.next();
     out.println(file.getPath()); 
   }
  }

  public static void output(String path,String regexp) {

   FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
   fileGroup1.print(System.out);
  }
 
  public static void main (String[] args) {
   output("C://","[A-z|.]*");
  }

Java 정규의 기능은 아직 매우 많은데 사실상 문자 처리라면 정규가 할 수 없는 일이 없다.(물론 정규 해석에 시간이 많이 걸리면 ||...)
이상은 자바의 정규 표현식에 대한 자료 정리입니다. 후속적으로 관련 자료를 계속 보충합니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기