Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revisionLast revisionBoth sides next revision | ||
public:computer:regexp [2021/08/23 18:27] – [임의의 문자] alex | public:computer:regexp [2023/01/01 00:56] – [참조 그룹] 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:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |