Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| public:computer:regexp [2021/08/23 18:27] – [임의의 문자] alex | public:computer:regexp [2023/01/01 00:58] (current) – [선택, 그룹, 역참조] alex | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Regular Expressions ====== | ====== Regular Expressions ====== | ||
| - | <lead> | + | > **정규표현식은 특정 문자열을 가리키는 패턴이다. 즉 이 패턴으로 원하는 문자열을 찾는다.** - 켄 톰슨 |
| ===== 기본 패턴 찾기 ===== | ===== 기본 패턴 찾기 ===== | ||
| Line 9: | Line 9: | ||
| * 수량자; {숫자}: 해당 갯수, {최소숫자, | * 수량자; {숫자}: 해당 갯수, {최소숫자, | ||
| * 상수 | * 상수 | ||
| + | |||
| + | ^ 정규표현식의 메타 문자 | ||
| + | ^ 메타 문자 | ||
| + | ^ . | 점 | U+002E | ||
| + | ^ \ | 역슬래시 | ||
| + | ^ %%|%% | 세로줄 | ||
| + | ^ %%^%% | 악센트 기호 | ||
| + | ^ $ | 달러 기호 | ||
| + | ^ ? | 물음표 | ||
| + | ^ * | 별표 | ||
| + | ^ + | 덧셈 기호 | ||
| + | ^ [ | 왼쪽 대괄호 | ||
| + | ^ ] | 오른쪽 대괄호 | ||
| + | ^ { | 왼쪽 중괄호 | ||
| + | ^ } | 오른쪽 중괄호 | ||
| + | ^ ( | 왼쪽 소괄호 | ||
| + | ^ ) | 오른쪽 소괄호 | ||
| + | |||
| + | |||
| ==== 숫자 ==== | ==== 숫자 ==== | ||
| Line 19: | Line 38: | ||
| ^ 단축 문자((이 외에 더 있음, 정규표현식 엔진에 따라 지원 여부 다양)) | ^ 단축 문자((이 외에 더 있음, 정규표현식 엔진에 따라 지원 여부 다양)) | ||
| + | ^ 단축문자 | ||
| ^ \a | 벨 문자 | ^ \a | 벨 문자 | ||
| ^ [\b] | 백스페이스 문자 | ^ [\b] | 백스페이스 문자 | ||
| Line 50: | Line 70: | ||
| ==== 참조 그룹 ==== | ==== 참조 그룹 ==== | ||
| - | * 찾고자 하는 내용을 ()로 감싼 후(참조) $1, $2 혹은 \1, \2와 같이 역참조 | + | * 찾고자 하는 내용을 ()로 감싼 후(참조) |
| Line 67: | Line 87: | ||
| * \A; ^의 기능처럼 해당 패턴이 행의 시작 위치에 나오는지 찾는다. PCRE(Perl Compatible Regular Expression) | * \A; ^의 기능처럼 해당 패턴이 행의 시작 위치에 나오는지 찾는다. PCRE(Perl Compatible Regular Expression) | ||
| * \Z, \z; 해당 패턴이 행의 끝에 나오는지 | * \Z, \z; 해당 패턴이 행의 끝에 나오는지 | ||
| - | * | + | * \Q문자\E; 문자열을 상수로 지정 |
| ===== 선택, 그룹, 역참조 ===== | ===== 선택, 그룹, 역참조 ===== | ||
| + | * 그룹; 텍스트를 괄호로 묶은 것 | ||
| + | * 두 가지 이상의 패턴 중 하나를 선택할 때 | ||
| + | * 서브패턴을 만들 때 | ||
| + | * 나중에 역참조하기 위해 참조 그룹을 지정할 때 | ||
| + | * 수량자 같이 그룹으로 묶은 패턴에 어떤 작업을 적용할 때 | ||
| + | * 비참조 그룹을 사용할 때 | ||
| + | * 원자 그룹을 만들 때(고급과정) | ||
| + | * 선택 alternation; | ||
| + | |||
| + | ^ 정규표현식 옵션((서브패턴 이름 지정은 http:// | ||
| + | ^ 옵션 | ||
| + | ^ (?d) | 유닉스 행 | 자바 | ||
| + | ^ (?i) | 대소문자 구분 없앰 | ||
| + | ^ (iJ) | 이름 반복 허용 | ||
| + | ^ (?m) | 다중 행 | PCRE, Perl, 자바 | ||
| + | ^ (?s) | 한 행(dotall) | ||
| + | ^ (?u) | 유니코드 | ||
| + | ^ (?U) | 욕심쟁이 모드 해제 | ||
| + | ^ (?x) | 공백과 코멘트는 무시 | ||
| + | ^ (? | ||
| + | |||
| + | ^ Perl 변경자(플래그)((http:// | ||
| + | ^ 변경자 | ||
| + | ^ a | \d, \s, \w 및 ASCII 범위 내의 POSIX 문자 | ||
| + | ^ c | 찾기 실패 후 현재 위치 유지 | ||
| + | ^ d | 현재 플랫폼의 기본 설정 사용 | ||
| + | ^ g | global 모드 설정 | ||
| + | ^ i | 대소문자 구분 없앰 | ||
| + | ^ l | 현재 로케일 설정 사용 | ||
| + | ^ m | 다중 행 문자열 | ||
| + | ^ p | 찾은 문자열을 저장 | ||
| + | ^ s | 문자열을 한 행으로 간주 | ||
| + | ^ u | 유니코드 규칙 사용 | ||
| + | ^ x | 공백과 코멘트 무시 | ||
| + | |||
| + | * 서브패턴 ex) (the|The|THE), | ||
| + | * 그룹 참조와 역참조; \1, \$1 | ||
| + | * 그룹 이름 지정; ?< | ||
| + | * 그룹 이름으로 참조; \$+{one}, \$+{two} | ||
| + | |||
| + | ^ 그룹 이름 지정 구문 | ||
| + | ^ 구문 | ||
| + | ^ (?< | ||
| + | ^ (? | ||
| + | ^ (? | ||
| + | ^ \k< | ||
| + | ^ \k' | ||
| + | ^ \g{name} | ||
| + | ^ \k{name} | ||
| + | ^ (? | ||
| + | |||
| + | * 비참조 그룹; 역참조가 필요 없을 경우 ex) (?: | ||
| + | * 원자 그룹; 비참조 그룹 중 하나. 백트래킹 backtracking을 하는 정규표현식 엔진을 사용하는 경우, 이 그룹을 사용하면 정규표현식 전체는 아니더라도 원자 그룹에 해당하는 부분의 백트래킹 기능을 없앰. | ||
| + | * ex) (?>the) | ||
| ===== 문자 클래스 ===== | ===== 문자 클래스 ===== | ||
| + | * 대괄호식 bracketed expressions | ||
| + | * [a-z], [A-Z], [aeiou], [0-9], ... | ||
| + | * 부정 문자 클래스; [^문자] | ||
| + | * 합집합; [0-3[6-9]] | ||
| + | * 차집합; [a-z&& | ||
| + | |||
| + | ==== POSIX 문자 클래스 ==== | ||
| + | ^ POSIX 문자 클래스 | ||
| + | ^ 문자 클래스 | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | ^ < | ||
| + | |||
| + | |||
| ===== 유니코드와 기타 문자 ===== | ===== 유니코드와 기타 문자 ===== | ||
| + | * \u16진수코드; | ||
| + | * 8진수로 문자 찾기; \351(==\u00e9) | ||
| + | * 제어문자 찾기; /cx | ||
| + | |||
| ===== 수량자 ===== | ===== 수량자 ===== | ||
| + | * 욕심많고, | ||
| + | * 욕심쟁이; | ||
| + | * 게으른(또는 느슨한) 수량자; 우선 문자열의 시작 위치부터 검색. 원하는 문자열을 찾을 때까지 하나씩 문자를 증가시키면서 찾다가, 계속 찾지 못하면 마지막으로 전체 텍스트를 검사. 일반 수량자 뒤에 물음표(? | ||
| + | * 독점적인 수량자; 전체 텍스트를 가져온 후, 찾고자 하는 문자열인지를 검사. 오직 한 번만 시도, 백트래킹은 하지 않음. 일반 수량자 뒤에 덧셈기호(+)를 붙인다. | ||
| + | * 클리니 스타(*) | ||
| + | * *, +, ? | ||
| + | |||
| + | ^ 기본 수량자 | ||
| + | ^ 구문 | ||
| + | ^ ? | 0 또는 하나 | ||
| + | ^ + | 하나 이상 | ||
| + | ^ * | 0 또는 그 이상 | ||
| + | |||
| + | ^ 게으른 수량자 | ||
| + | ^ 구문 | ||
| + | ^ ?? | 게으르게 0번 또는 한 번 | | ||
| + | ^ +? | 게으르게 한 번 이상 | ||
| + | ^ *? | 게으르게 0번 이상 | ||
| + | ^ {n}? | 게으르게 n번 | | ||
| + | ^ {n.}? | 게으르게 n번 이상 | ||
| + | ^ {m, | ||
| + | |||
| + | ^ 독정적인 수량자 | ||
| + | ^ 구문 | ||
| + | ^ ?+ | 독점적으로 0번 또는 한 번 | | ||
| + | ^ ++ | 독점적으로 한 번 이상 | ||
| + | ^ *+ | 독점적으로 0번 이상 | ||
| + | ^ {n}+ | 독점적으로 n번 | | ||
| + | ^ {n.}+ | 독점적으로 n번 이상 | ||
| + | ^ {m, | ||
| + | |||
| + | |||
| + | |||
| + | ===== 탐색 ===== | ||
| + | * lookaround | ||
| + | * 긍정형 전방 탐색(Positive lookaheads) | ||
| + | * 부정형 전방 탐색(Negative lookaheads) | ||
| + | * 긍정형 후방 탐색(Positive lookbehinds) | ||
| + | * 부정형 후방 탐색(Negative lookbehinds) | ||
| ===== 자주 쓰는 정규표현식 ===== | ===== 자주 쓰는 정규표현식 ===== | ||
| Line 112: | Line 254: | ||
| - -가 2개 이상 | - -가 2개 이상 | ||
| - >로 닫음 | - >로 닫음 | ||
| + | |||
| + | * < | ||
| + | * 숫자를 제외한 모든 문자 제거; <alert type=" | ||
| + | * 숫자만으로 되어있는 사업자 번호 -> 사업자번호 형식; <alert type=" | ||
| + | * 숫자만으로만 되어있는지 확인; <alert type=" | ||
| + | * 첫글자만 보이게 마스킹; <alert type=" | ||
| + | * Password Validataions (JAVA & TypeScript)< | ||
| + | |||
| + | public static Boolean hasSpecialCharacter(String strPassword) | ||
| + | { | ||
| + | Boolean bHasSpecialCharacter = Pattern.matches(" | ||
| + | |||
| + | if(true == bHasSpecialCharacter) | ||
| + | { | ||
| + | System.out.println(strPassword + " has Special Character." | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | System.out.println(strPassword + " has no Special Character." | ||
| + | } | ||
| + | |||
| + | return bHasSpecialCharacter; | ||
| + | } | ||
| + | |||
| + | public static Boolean isValidPassword(String strPassword) | ||
| + | { | ||
| + | Boolean bValid = Pattern.matches(" | ||
| + | |||
| + | System.out.println(strPassword + ":" | ||
| + | return bValid; | ||
| + | } | ||
| + | |||
| + | public static Boolean hasAlphabet(String strPassword) | ||
| + | { | ||
| + | Boolean bHasAlphabet = Pattern.matches(" | ||
| + | |||
| + | if(true == bHasAlphabet) | ||
| + | { | ||
| + | System.out.println(strPassword + " has Alphabet." | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | System.out.println(strPassword + " has no Alphabet." | ||
| + | } | ||
| + | |||
| + | return bHasAlphabet; | ||
| + | } | ||
| + | |||
| + | public static Boolean hasDigit(String strPassword) | ||
| + | { | ||
| + | Boolean bHasDigit = Pattern.matches(" | ||
| + | |||
| + | if(true == bHasDigit) | ||
| + | { | ||
| + | System.out.println(strPassword + " has Digits." | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | System.out.println(strPassword + " has no Digits." | ||
| + | } | ||
| + | |||
| + | return bHasDigit; | ||
| + | } | ||
| + | |||
| + | public static void testPassword(String strPassword) | ||
| + | { | ||
| + | System.out.println(" | ||
| + | |||
| + | hasAlphabet(strPassword); | ||
| + | hasDigit(strPassword); | ||
| + | hasSpecialCharacter(strPassword); | ||
| + | }</ | ||
| + | function hasAlphabet(strPassword: | ||
| + | const reg = new RegExp(" | ||
| + | const bHasAlphabet = reg.test(strPassword) | ||
| + | |||
| + | if(false === bHasAlphabet) { | ||
| + | console.log(`${strPassword} has no alphabet.`) | ||
| + | } else { | ||
| + | console.log(`${strPassword} has alphabet.`) | ||
| + | } | ||
| + | | ||
| + | return bHasAlphabet | ||
| + | } | ||
| + | |||
| + | function hasDigit(strPassword: | ||
| + | const reg = new RegExp(" | ||
| + | const bHasDigit = reg.test(strPassword) | ||
| + | |||
| + | if(false === bHasDigit) { | ||
| + | console.log(`${strPassword} has no digit.`) | ||
| + | } else { | ||
| + | console.log(`${strPassword} has digit.`) | ||
| + | } | ||
| + | |||
| + | return bHasDigit | ||
| + | } | ||
| + | |||
| + | function hasSpecialCharacter(strPassword: | ||
| + | const reg = new RegExp(" | ||
| + | const bHasSpecialCharacter = reg.test(strPassword) | ||
| + | |||
| + | if(false === bHasSpecialCharacter){ | ||
| + | console.log(`${strPassword} has no special character.`) | ||
| + | } else { | ||
| + | console.log(`${strPassword} has special character.`) | ||
| + | } | ||
| + | |||
| + | return bHasSpecialCharacter | ||
| + | } | ||
| + | |||
| + | function isValidPassword(strPassword: | ||
| + | const reg = new RegExp(" | ||
| + | const bValid = reg.test(strPassword) | ||
| + | |||
| + | if(false === bValid) { | ||
| + | console.log(`${strPassword} is invalid.`) | ||
| + | } else { | ||
| + | console.log(`${strPassword} is valid.`) | ||
| + | } | ||
| + | |||
| + | return bValid | ||
| + | } | ||
| + | |||
| + | function testPassword(strPassword: | ||
| + | console.log(`Your Password is : ${strPassword}`) | ||
| + | |||
| + | hasAlphabet(strPassword) | ||
| + | hasDigit(strPassword) | ||
| + | hasSpecialCharacter(strPassword) | ||
| + | |||
| + | isValidPassword(strPassword) | ||
| + | |||
| + | }</ | ||
| + | * camelCase to snake_case and MACRO_CASE (JAVA)< | ||
| + | public static String getSnakeCaseFromCamelCase(String strCamelCase) | ||
| + | { | ||
| + | return strCamelCase.replaceAll(" | ||
| + | } | ||
| + | |||
| + | public static String getMacroCaseFromCamelCase(String strCamelCase) | ||
| + | { | ||
| + | return strCamelCase.replaceAll(" | ||
| + | } | ||
| + | </ | ||
| + | * Card Number Validation (TypeScript)< | ||
| + | function validateIBKCEOCard(strCardNumber: | ||
| + | const regDigitsOnly = /(\D+)/gi | ||
| + | const strDigits = strCardNumber.replace(regDigitsOnly, | ||
| + | |||
| + | if (strDigits.length != 16) { | ||
| + | console.log(strCardNumber + ' is invalid card number' | ||
| + | return | ||
| + | } | ||
| + | | ||
| + | console.log(' | ||
| + | |||
| + | const regValidate: | ||
| + | const bValid = regValidate.test(strDigits) | ||
| + | |||
| + | console.log(' | ||
| + | } | ||
| + | </ | ||
| + | |||
| ===== Tools ===== | ===== Tools ===== | ||
| + | |||
| + | ==== 프로그램과 라이브러리 ==== | ||
| + | * Perl | ||
| + | * PCRE(Perl Compatible Regular Expression) | ||
| + | * 루비에서 사용하는 오니구루마 | ||
| + | * 파이썬 | ||
| + | * RE2 | ||
| + | |||
| + | |||
| ==== On-line ==== | ==== On-line ==== | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| - | * | + | * [[https:// |
| + | |||
| ==== Offline ==== | ==== Offline ==== | ||
| * QED | * QED | ||
| Line 129: | Line 446: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * reggy | ||
| + | |||
| + | |||
| + | ===== References ===== | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||