정규식은 특정 패턴을 사용하여 문자열 유형을 일치시키는 공식입니다. 정규식은 일부 일반 문자와 일부 메타 문자로 구성됩니다. 일반 문자에는 대문자와 소문자, 숫자가 포함되지만, 메타 문자에는 특별한 의미가 있습니다. .Net 플랫폼이든 Java 플랫폼이든 정규식으로 표현되는 의미는 동일합니다. 아래에서는 주로 Java 정규식의 기능을 분석합니다. 이 기사가 귀하에게 도움이 되기를 바라며 참고용으로만 사용하시기 바랍니다.
jdk1.4가 java.util.regex 패키지를 출시한 이후로 Java 정규식은 매우 복잡한 시스템이기 때문에 이는 우리에게 훌륭한 Java 정규식 애플리케이션 플랫폼을 제공했습니다.
// 백슬래시
/t 간격('/u0009')
/n 줄 바꿈('/u000A')
/r Enter('/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 탈출
/b 단어 경계
/B 단어가 아닌 경계
/G 이전 경기 종료
^ 제한으로 시작
^java 조건은 Java로 시작하는 문자로 제한됩니다.
$는 제한의 끝입니다.
java$ 조건은 종료 문자로 java로 제한됩니다.
이 조건은 /n을 제외한 모든 단일 문자를 제한합니다.
java.. 조건은 개행을 제외하고 java 뒤의 두 문자로 제한됩니다.
특정 제한 사항 "[]" 추가
[az] 조건은 소문자 a~z 범위의 한 문자로 제한됩니다.
[AZ] 조건은 대문자 A~Z 범위의 한 문자로 제한됩니다.
[a-zA-Z] 조건은 소문자 a~z 또는 대문자 A~Z 범위의 한 문자로 제한됩니다.
[0-9] 조건은 소문자 0~9 범위의 한 문자로 제한됩니다.
[0-9a-z] 조건은 소문자 0~9 또는 a~z 범위의 한 문자로 제한됩니다.
[0-9[az]] 조건은 소문자 0~9 또는 a~z 범위의 한 문자(교차점)로 제한됩니다.
[]에 ^를 추가한 다음 다른 제한사항 "[^]"을 추가하세요.
[^az] 조건은 소문자 a~z 범위의 한 문자로 제한됩니다.
[^AZ] 조건은 대문자가 아닌 A~Z 범위의 한 문자로 제한됩니다.
[^a-zA-Z] 조건은 소문자 a~z 또는 대문자 A~Z가 아닌 범위의 한 문자로 제한됩니다.
[^0-9] 조건은 소문자 이외의 0~9 범위의 한 문자로 제한됩니다.
[^0-9a-z] 조건은 소문자 이외의 0~9 또는 a~z 범위의 한 문자로 제한됩니다.
[^0-9[az]] 조건은 소문자가 아닌 0~9 또는 a~z 범위의 한 문자(교차점)로 제한됩니다.
제한 조건이 특정 문자가 0번 이상 나타나는 경우에는 "*"를 사용할 수 있습니다.
J* 0J 이상
.* 0개 이상의 문자
J.* DJ와 D 사이에 0자 이상의 문자가 있습니다.
제한 조건이 특정 문자가 두 번 이상 나타나는 경우 "+"를 사용할 수 있습니다.
J+ 1 이상 J
.+ 1자 이상
J.DJ와 D 사이에 +1자 이상
특정 문자가 0번 이상 나타나는 것이 제한되는 경우 "?"를 사용할 수 있습니다.
JA? J 또는 JA가 나타납니다.
문자 "{a}"의 연속 발생 횟수를 지정된 횟수로 제한합니다.
J{2} JJ
J{3} JJJ
문자가 1개 이상이며 "{a,}"가 있습니다.
J{3,} JJJ,JJJJ,JJJJJ,???(J가 3번 이상 공존함)
문자 수 초과 및 b 문자 미만 "{a,b}"
J{3,5} JJJ 또는 JJJJ 또는 JJJJJ
"|" 둘 중 하나를 선택하세요.
J|AJ 또는 A
자바|안녕하세요 자바 또는 안녕하세요
"()"는 조합 유형을 지정합니다 . <BR>예를 들어 <a href="index.html/">index</a>의 <a href></a> 사이에 있는 데이터를 쿼리하면 다음과 같이 쓸 수 있습니다. <a .*href=/".*/">(.+?)</a>
Pattern.compile 함수를 사용할 때 Java 정규식의 일치 동작을 제어하는 매개변수를 추가할 수 있습니다.
패턴 Pattern.compile(문자열 정규식, int 플래그)
플래그의 값 범위는 다음과 같습니다.
Pattern.CANON_EQ 두 문자의 "표준 분해"가 정확히 동일한 경우에만 일치가 고려됩니다. 예를 들어, 이 플래그를 사용한 후 "a/u030A" 표현식은 "?"와 일치합니다. 기본적으로 "정규적 동등성"은 고려되지 않습니다.
패턴.CASE_INSENSITIVE(?i)
기본적으로 대소문자를 구분하지 않는 일치는 US-ASCII 문자 집합에서만 작동합니다. 이 플래그를 사용하면 대소문자에 관계없이 표현식이 일치하게 됩니다. 유니코드 문자의 명확한 일치를 수행하려면 UNICODE_CASE를 이 플래그와 결합하면 됩니다.
패턴.COMMENTS(?x)
이 모드에서는 Java 정규 표현식의 공백 문자가 일치 시 무시됩니다. (번역자 참고 사항: 표현식에서 "//s"를 참조하는 것이 아니라 표현식에서 공백, 탭, 캐리지 리턴 등을 참조합니다.) . 주석은 #으로 시작하고 줄 끝까지 계속됩니다. Unix 라인 모드는 내장 플래그를 통해 활성화할 수 있습니다.
패턴.DOTALL(?s)
이 모드에서 '.' 표현식은 줄 끝을 포함하여 모든 문자와 일치할 수 있습니다. 기본적으로 '.' 표현식은 줄 종결자와 일치하지 않습니다.
패턴.MULTILINE(?m)
이 모드에서 '^' 및 '$'는 각각 줄의 시작과 끝과 일치합니다. 또한 '^'는 여전히 문자열의 시작과 일치하고 '$'도 문자열의 끝과 일치합니다. 기본적으로 이 두 표현식은 문자열의 시작과 끝만 일치합니다.
Pattern.UNICODE_CASE(?u)
이 모드에서 CASE_INSENSITIVE 플래그도 활성화하면 유니코드 문자와 대소문자를 구분하지 않고 일치합니다. 기본적으로 대소문자를 구분하지 않는 일치는 US-ASCII 문자 집합에서만 작동합니다.
패턴.UNIX_LINES(?d)
이 모드에서는 '/n'만 줄 바꿈으로 간주되며 '.', '^' 및 '$'와 일치합니다. 모호한 개념을 제쳐두고 다음은 몇 가지 간단한 Java 일반 사용 사례입니다.
◆예를 들어 문자열에 유효성 검사가 포함된 경우
다음과 같이 코드 코드를 복사합니다 .
//Java로 시작하고 어떤 것으로 끝나는 문자열을 찾습니다.
패턴 패턴 = Pattern.compile("^Java.*");
Matcher matcher = Pattern.matcher("자바는 인간이 아닙니다.");
boolean b= matcher.matches(); //조건이 만족되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
System.out.println(b);
여러 조건으로 문자열을 분할하는 경우
다음과 같이 코드 코드를 복사합니다 .
패턴 패턴 = 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.compile("Java 정규식");
Matcher matcher = Pattern.matcher("Java 정규식 Hello World, 정규식 Hello World");
//정규 패턴과 일치하는 첫 번째 데이터를 교체합니다.
System.out.println(matcher.replaceFirst("Java"));
텍스트 교체(전체)
다음과 같이 코드 코드를 복사합니다 .
패턴 패턴 = Pattern.compile("Java 정규식");
Matcher matcher = Pattern.matcher("Java 정규식 Hello World, 정규식 Hello World");
//정규 패턴과 일치하는 첫 번째 데이터를 교체합니다.
System.out.println(matcher.replaceAll("Java"));
리터럴 교체(문자 교체) 다음과 같이 코드 코드를 복사합니다 .
패턴 패턴 = Pattern.compile("Java 정규식");
Matcher matcher = Pattern.matcher("Java 정규식 Hello World, 정규식 Hello World ");
StringBuffer sbr = 새로운 StringBuffer();
동안(matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
이메일 주소인지 확인하세요 다음과 같이 코드 코드를 복사합니다 .
문자열 str="
[email protected]";
패턴 패턴 = Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSITIVE );
일치자 matcher = Pattern.matcher(str);
System.out.println(matcher.matches());
HTML 태그 제거 다음과 같이 코드 코드를 복사합니다 .
패턴 패턴 = Pattern.compile("<.+?>", Pattern.DOTALL);
일치자 matcher = Pattern.matcher("<a href="index.html/">홈페이지</a>");
String string = matcher.replaceAll("");
System.out.println(string);
HTML에서 해당 조건 문자열 찾기 다음과 같이 코드 코드를 복사합니다 .
패턴 패턴 = Pattern.compile("href="(.+?)/"");
일치자 matcher = Pattern.matcher("<a href="index.html/">홈페이지</a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
◆http://address <BR>코드 가로채기 다음과 같이 코드 코드를 복사합니다 .
//URL 차단
패턴 패턴 = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");
일치자 matcher = Pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer 버퍼 = 새로운 StringBuffer();
동안(matcher.find()){
buffer.append(matcher.group());
buffer.append("/r/n");
System.out.println(buffer.toString());
}
◆지정된 {} 한자 <BR> 코드 바꾸기 다음과 같이 코드 코드를 복사합니다 .
String str = "현재 Java 개발 역사는 {0}년에서 {1}년입니다.";
String[][] object={new String[]{"//{0//}","1995"},new String[]{"//{1//}","2007"}};
System.out.println(replace(str,object));
공개 정적 문자열 교체(최종 문자열 sourceString,Object[] 개체) {
문자열 임시=sourceString;
for(int i=0;i<object.length;i++){
String[] 결과=(String[])객체[i];
패턴 패턴 = Pattern.compile(결과[0]);
일치자 matcher = Pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
복귀온도;
}
◆정규 조건을 사용하여 지정된 디렉터리의 파일<BR>코드를 쿼리합니다. 다음과 같이 코드 코드를 복사합니다 .
//파일 목록을 캐시하는 데 사용됩니다.
개인 ArrayList 파일 = 새로운 ArrayList();
//파일 경로를 호스트하는 데 사용됩니다.
개인 문자열 _path;
//병합되지 않은 정규 수식을 전달하는 데 사용됩니다.
개인 문자열 _regexp;
MyFileFilter 클래스는 FileFilter를 구현합니다.
/**
* 일치하는 파일 이름
*/
공개 부울 accept(파일 파일) {
노력하다 {
패턴 패턴 = Pattern.compile(_regexp);
일치자 일치 = 패턴.매처(file.getName());
match.matches()를 반환합니다.
} 잡기(예외 e) {
사실을 반환;
}
}
}
/**
* 입력 스트림을 구문 분석
* @param 입력
*/
FilesAnalyze(문자열 경로, 문자열 정규 표현식){
getFileName(경로, 정규식);
}
/**
* 파일 이름 분석 및 파일 추가
* @param 입력
*/
개인 무효 getFileName(문자열 경로, 문자열 정규식) {
//목차
_path=경로;
_regexp=정규식;
파일 디렉터리 = 새 파일(_path);
File[] filesFile = 디렉토리.listFiles(new MyFileFilter());
if (filesFile == null) 반환;
for (int j = 0; j < filesFile.length; j++) {
files.add(files파일[j]);
}
반품;
}
/**
* 출력정보 표시
* @param 출력
*/
공개 무효 인쇄(PrintStream 출력) {
반복자 요소 = files.iterator();
동안(elements.hasNext()) {
파일 파일=(파일) elements.next();
out.println(file.getPath());
}
}
공개 정적 무효 출력(문자열 경로, 문자열 정규식) {
FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
fileGroup1.print(System.out);
}
공개 정적 무효 메인(String[] args) {
출력("C://","[Az|.]*");
}
Java 정규식에는 실제로 많은 기능이 있습니다. 문자 처리만 하면 정규식이 할 수 없는 일이 없습니다.