1. regex(정규 표현식): RegularExpressions(StringTokenizer 대체); Unix에서 널리 사용되는 강력한 도구인 Perl은 정규 표현식을 사용하는 것이 훨씬 좋습니다.
주로 문자열 일치, 검색 및 교체에 사용됩니다. 예를 들어, IP 일치(256 미만 범위)는 정규식을 사용하여 웹 페이지에서 많은 수의 이메일 주소를 추출하여 웹 페이지에서 링크를 추출하는 데 사용하기 쉽습니다. Matcher(문자열을 패턴과 일치시킨 결과) 및 패턴을 포함합니다.
다음과 같이 코드 코드를 복사합니다 .
/*
* 이 문자열이 주어진 정규식(또한 문자열)과 일치하는지 여부를 알려줍니다.
*/
System.out.println("abc".matches("..."));//각 "."는 문자를 나타냅니다.
다음과 같이 코드 코드를 복사합니다 .
/*
* 문자열의 모든 숫자를 "-"로 바꿉니다. 일반적인 방법에서는 charAt를 하나씩 판단해야 합니다.
* "//d"는 임의의 숫자를 나타내거나 "[0-9]"로 바꿉니다.
* "//D"는 숫자가 아닌 모든 것을 나타내거나 "[^0-9]"로 대체됩니다.
*/
System.out.println("ab54564654sbg48746bshj".replaceAll("[0-9]", "-"));//각 "."는 하나의 문자를 나타냅니다.
둘,
다음과 같이 코드 코드를 복사합니다 .
/*
* compile은 주어진 정규 표현식을 패턴으로 컴파일합니다(각 컴파일에는 시간이 걸립니다). {3}은 정확히 3번을 의미합니다.
* X{n} X, 정확히 n번
* X{n,} X, 최소 n회
* X{n,m} X, n회 이상, m회 이하
*/
패턴 p = Pattern.compile("[az]{3}");
일치자 m = p.matcher("ggs");//이 패턴으로 주어진 입력과 일치하는 일치자를 만듭니다. 내부적으로 우선순위 상태 자동장치가 실제로 생성됩니다(컴파일 원칙).
//매처와 매칭에서 매칭되는 문자열은 실제로는 CharSequence(인터페이스)이지만, String은 이 인터페이스를 구현하고 다형성을 가지고 있습니다.
System.out.println(m.matches());//"ggss"이면 일치하지 않습니다.
//언제든지 직접 "ggs".matches("[az]{3}")를 사용할 수 있지만 위의 방법에는 장점이 있으며 적어도 더 효율적이며 Pattern 및 Matcher가 많은 기능을 제공합니다.
3. 정규식 ". * +"에서 메타 문자를 호출합니다. ctrl + Shift + "/"는 주석을 의미하며, 주석을 제거하려면 "/"로 바꿉니다.
다음과 같이 코드 코드를 복사합니다 .
"a".matches(".");//true, "."는 중국어를 포함한 모든 문자를 나타냅니다.
"aa".matches("aa");//true, 즉 일반 문자열을 정규식으로 사용할 수도 있습니다.
/*
* true, "*"는 0개 이상의 문자를 의미하지만, 다음 문자는 첫 번째 문자와 동일해야 합니다.
* 그렇지 않으면 false, 즉 단일 문자로 구성된 문자열인지 판단합니다.
*/
"aaaa".matches("a*");
"".matches("a*");//true
"aaa".matches("a?");//true, 1회 또는 0회
"".matches("a?");//true
"a".matches("a?");//true
"544848154564113".matches("//d{3,100}");//true
//가장 간단한 IP 판단이지만, 255를 넘으면 판단할 수 없다.
"192.168.0.aaa".matches("//d{1,3}//.//d{1,3}//.//d{1,3}//d{1,3}" );
"192".matches("[0-2][0-9][0-9]");
4. [abc]는 모든 문자와 일치함을 의미하고, [^abc]는 abc 이외의 문자를 의미합니다(여전히 문자여야 하며, 빈 문자열인 경우 false가 반환됨). "[az ]|[AZ]"는 특정 대문자 또는 소문자입니다. [AZ&&[ABS]]는 대문자와 ABS 중 하나를 의미합니다.
다음과 같이 코드 코드를 복사합니다 .
//|와 || 사이에는 차이가 없다는 것을 알았으나 &와 && 사이에는 차이가 있습니다. 이것이 올바른 이해 방법인지 모르겠습니다.
System.out.println("C".matches("[AZ&&[ABS]]"));//false
System.out.println("C".matches("[AZ&[ABS]]"));//true
System.out.println("A".matches("[AZ&&[ABS]]"));//true
System.out.println("A".matches("[AZ&[ABS]]"));//true
System.out.println("C".matches("[AZ|[ABS]]"));//true
System.out.println("C".matches("[AZ||[ABS]]"));//true
5. /w 단어 문자: [a-zA-Z_0-9] 사용자 이름 일치 시; /s 공백 문자: [ /t/n/x0B/f/r] /S 공백이 아닌 문자: [^/s ] ;/W 단어가 아닌 문자: [^/w].
다음과 같이 코드 코드를 복사합니다 .
" /n/t/r".matches("//s{4}");//true
" ".matches("//S");//false
"a_8".matches("//w{3}");//true
//"+"는 한 번 또는 여러 번을 의미합니다.
"abc888&^%".matches("[az]{1,3}//d+[&^#%]+");//true
/*
* 매칭되는 문자는 백슬래시일 뿐, "/"로 쓴 후 다음 ",
* 이전의 "일치할 수 없습니다."는 CE가 됩니다.
* 뒤에는 "//"가 올 수 없습니다. 그렇지 않으면 런타임 오류가 발생합니다(컴파일에는 문제 없음). "////"로 작성해야 합니다.
*/
System.out.println("//".matches("////"));//true
6. POSIX 문자 클래스(US-ASCII만 해당)
다음과 같이 코드 코드를 복사합니다 .
/p{Lower} 알파벳 소문자: [az] ;/p{Upper} 알파벳 대문자: [AZ] ;/p{ASCII} 모든 ASCII: [/x00-/x7F] ;/p{Alpha} 알파벳 문자: [/p{하위}/p{상위}] ;/p{Digit} 십진수: [0-9].
7. 경계 일치자
^ 줄의 시작 $ 줄의 끝/b 단어 경계/B 비단어 경계/A 입력의 시작/G 이전 일치의 끝/Z 입력의 끝, 마지막 종결자(있는 경우)에만 사용됩니다.
/z 입력 끝
다음과 같이 코드 코드를 복사합니다 .
"hello world".matches("^h.*");//^ 줄의 시작
"hello world".matches(".*ld$");//$line 끝
"hello world".matches("^h[az]{1,3}o//b.*");//b단어 경계
"helloworld".matches("^h[az]{1,3}o//b.*");
" /n".matches("^[//s&&[^//n]]*//n$");//공백 문자로 시작하는 빈 줄을 판단합니다.
8. find 메소드에서 m.start() 및 m.end()를 사용하여 시작 위치와 끝 위치 사이의 다음 위치를 찾을 수 없으면 오류가 발생합니다.
다음과 같이 코드 코드를 복사합니다 .
패턴 p = Pattern.compile("//d{3,5}");
문자열 s = "133-34444-333-00";
일치자 m = p.matcher(s);
m.matches();//matches는 모든 문자열과 일치합니다.
m.reset();
/*
* 아래에서 Reset 메소드를 먼저 호출하면 true, true, true, false가 출력됩니다.
* 그렇지 않으면 두 번째 찾기도 false를 출력합니다.
*이유는 다음과 같습니다.
* 일치는 첫 번째 "-"와 일치하고 일치하지 않음을 발견했지만 이 네 문자가 먹혔을 때부터 다시 일치가 시작됩니다.
* 34444가 시작되고 두 번째 찾기는 333부터 시작됩니다. find가 다음 하위 시퀀스와 일치하기 때문입니다.
* 재설정 방법을 사용하면 성냥이 먹은 문자열을 성냥이 뱉어낼 수 있습니다.
* 요약: 일치 항목과 찾기 항목 간에는 재설정을 사용해야 합니다. 서로 영향을 미치기 때문입니다.
*
*/
m.find();
m.find();
m.find();//이 패턴과 일치하는 입력 시퀀스의 다음 하위 시퀀스를 찾으십시오.
m.find();
/*
* 영역의 시작 부분에서 시작하는 입력 시퀀스를 이 패턴과 일치시키려고 시도합니다.
* Thinking in java의 저자는 단어부터 어디까지 매칭을 시작해야 할지 명확하지 않기 때문에 이 방법을 심하게 비판했습니다.
* 다음 내용은 모두 사실입니다. 매번 처음부터 시작하기 때문입니다.
*/
m.lookAt();
m.lookAt();
m.lookAt();
m.lookAt();
9. 문자열 교체
다음과 같이 코드 코드를 복사합니다 .
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 TestRegexReplacement {
공개 정적 무효 메인(String[] args) {
패턴 p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//다음 매개변수는 정수입니다. 이는 "대소문자를 구분하지 않음"을 의미합니다.
Matcher m = p.matcher("Java java hxsyl Ilovejava java JaVaAcmer");
동안(m.find()) {
System.out.println(m.group());//m.group은 모든 Java를 출력합니다(대소문자 무시).
}
String s = m.replaceAll("Java");//String에도 이 메서드가 있습니다.
System.out.println(s);
m.reset();//find와 matcher가 서로 영향을 미치기 때문에 추가해야 합니다.
StringBuffer sb = new StringBuffer();
int i = 0;
/*
* 다음 방법은 발견된 java의 홀수를 "Java"로, 짝수를 "java"로 바꾸는 방법입니다.
*/
동안(m.find()) {
나++;
//i&1로 직접 쓸 수 없으며 부울로 변환해야 합니다.
if((i&1)==1) {
m.appendReplacement(sb, "Java");
}또 다른 {
m.appendReplacement(sb, "java");
}
}
m.appendTail(sb);//마지막으로 찾은 Java 뒤에 나머지 문자열을 추가합니다.
System.out.println(sb);//재설정 없이 Acmer만 출력됩니다.
}
}
10. 그룹화
다음과 같이 코드 코드를 복사합니다 .
/*
* 가장 바깥쪽 중괄호는 제외하고 각각 괄호를 추가합니다. 왼쪽 첫 번째 괄호가 첫 번째 그룹입니다.
*/
패턴 p = Pattern.compile("(//d{3,5})([az]{2})");
문자열 s = "123aaa-77878bb-646dd-00";
일치자 m = p.matcher(s);
동안(m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));//일치하는 숫자의 각 쌍을 출력합니다.
System.out.println(m.group(2));//일치하는 문자의 각 쌍을 출력합니다.
}
11. 웹페이지에서 이메일 캡처
다음과 같이 코드 코드를 복사합니다 .
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 키우기 방법이 필요한 경우, 방법명을 먼저 기재해주세요.
* 그런 다음 Ctrl + 1을 누르면 권장 사항이 나열되고 시스템이 이 방법을 생성합니다.
*/
공개 클래스 EmailSpider {
공개 정적 무효 메인(String[] args) {
// TODO 자동 생성된 메서드 스텁
노력하다 {
BufferedReader br = new BufferedReader(new FileReader("F://regex.html"));
문자열 = "";
노력하다 {
while((line=br.readLine())!=null) {
풀다(라인);
}
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
} 잡기(FileNotFoundException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
개인 정적 무효 해결(문자열 라인) {
// TODO 자동 생성된 메서드 스텁
//정규식이 해당 함수를 만족하지 않으면 문자열이므로 오류가 발생하지 않습니다.
패턴 p = Pattern.compile("[//w[.-]]+@[//w[.-]]+//.[//w]+");
일치자 m = p.matcher(line);
동안(m.find()) {
System.out.println(m.group());
}
}
}
12. 코드 통계
다음과 같이 코드 코드를 복사합니다 .
코드 보기
/*
* 코드의 빈 줄, 주석 줄 및 프로그램 줄 수를 계산합니다.
* 실제로 문자열에서는 startWith 및 endWith를 사용할 수도 있습니다.
* 프로젝트 관리자가 사용하는 경우 게으름을 방지하기 위해 각 줄의 문자 수가 {로 끝나는지 여부도 계산해야 합니다.
*/
import java.io.BufferedReader;
java.io.파일 가져오기;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
공개 클래스 CoderCount {
정적 긴 NormalLines = 0;
정적 긴 commentLines = 0;
정적 긴 whiteLines = 0;
공개 정적 무효 메인(String[] args) {
파일 f = new File("D://share//src");
File[] codeFiles = f.listFiles();
for(파일 하위: codeFiles){
if(child.getName().matches(".*//.java$")) {
해결(자식);
}
}
System.out.println("normalLines:" + NormalLines);
System.out.println("commentLines:" + commentLines);
System.out.println("whiteLines:" + whiteLines);
}
개인 정적 무효 해결(파일 f) {
BufferedReader br = null;
부울 주석 = false;
노력하다 {
br = new BufferedReader(new FileReader(f));
문자열 = "";
while((line = br.readLine()) != null) {
/*
* //일부 주석 줄 앞에 탭이 있습니다.
* readLine 이후에는 쓸 수 없습니다.
* 마지막 줄은 널 포인터가 됩니다.
*/
라인 = 라인.트림();
//readLine은 문자열을 읽은 후 개행 문자를 제거합니다.
if(line.matches("^[//s&&[^//n]]*$")) {
화이트라인++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
commentLines++;
코멘트 = 사실;
} else if (line.startsWith("/*") && line.endsWith("*/")) {
commentLines++;
} else if (true == 주석) {
commentLines++;
if(line.endsWith("*/")) {
댓글 = 거짓;
}
} else if (line.startsWith("//")) {
commentLines++;
} 또 다른 {
NormalLines++;
}
}
} 잡기(FileNotFoundException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
} 마지막으로 {
if(br != null) {
노력하다 {
br.닫기();
br = null;
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
}
}
13. 수량자
포함하다? *+; 기본값은 Greedy(탐욕)이며 Reluctant(Reluctant) 및 Possessive(독점)입니다.
다음과 같이 코드 코드를 복사합니다 .
//더 명확하게 볼 수 있도록 그룹화를 추가합니다.
패턴 p = Pattern.compile("(.{3,10})+[0-9]");
문자열 s = "aaaa5bbbb6";//길이는 10입니다.
일치자 m = p.matcher(s);
/*
* 이제 0-10을 출력합니다. 기본값은 Greedy입니다. 먼저 10자를 삼켜서 일치하지 않는 것을 찾아 하나를 뱉어내고 일치하는 것을 찾습니다.
* Pattern.compile("(.{3,10}?)+[0-9]")이 Reluctant가 되면 먼저 세 문자를 삼키고 불일치를 찾아 일치할 때까지 계속 삼켜서 0을 출력합니다. 5까지;
* Pattern.compile("(.{3,10}++)+[0-9]")이 Possessive(배타적)인 경우 먼저 10자를 삼키지만 뱉어내지 않으므로 일치하지 않습니다. ,
* 이 방법은 주로 높은 효율이 요구되는 곳에 사용됩니다(오차가 있을 수 있습니다).
*/
if(m.find()) {
System.out.println(m.start() + "----" + m.end());
}또 다른 {
System.put.println("일치하지 않습니다!");
}
14. 보충(비포획군)
다음과 같이 코드 코드를 복사합니다 .
//비캡처 그룹의 의미는 문자 그대로의 의미와 반대되는 의미로, 일치하면 캡처한다는 의미입니다.
패턴 p = Pattern.compile("(?=a).{3}");
/*
* a66을 출력합니다. 이는 a로 시작하도록 요구하는 것과 동일합니다. 또한 Pattern.compile("[a].{2}");을 작성할 수도 있습니다.
* Pattern.compile(".{3}(?!=a)")이 {2}[^a]로 끝나지 않고 다음 문자가 (lookahead)가 아닌 경우 44a, 66b가 출력되고, 따라서 이 사용법은 일반적으로 사용되지 않습니다.
* Pattern.compile(".{3}(?=a)")이면 444가 출력됩니다.(?=a가 전방에 배치되므로) 그룹에 포함됩니다. , 뒤쪽에 배치하면 그룹에 포함되지 않습니다.
*
*
*/
문자열 s = "444a66b";
일치자 m = p.matcher(s);
동안(m.find()) {
System.out.println(m.group());
}
15. 역참조
다음과 같이 코드 코드를 복사합니다 .
패턴 p = Pattern.compile("(//d//d)//1");
/*
* 출력 true, //1은 첫 번째 그룹과 동일함을 의미하며, 1213으로 변경하면 잘못된 것입니다.
* Pattern.compile("(//d(//d))//2")인 경우 122로 변경해야 합니다.
*
*/
문자열 s = "1212";
일치자 m = p.matcher(s);
System.out.println(m.matches());
16. 플래그의 약어
"."는 개행 문자와 일치하지 않습니다. CASE_INSENSITIVE를 기억하세요. "대소문자를 구분하지 않는 일치도 포함된 플래그 표현식(?i)을 통해 활성화할 수 있습니다."