정규표현식은 특정 문자열을 가리키는 패턴이다. 즉 이 패턴으로 원하는 문자열을 찾는다. - 켄 톰슨
| 정규표현식의 메타 문자 | |||
|---|---|---|---|
| 메타 문자 | 이름 | 코드 포인트 | 의미 |
| . | 점 | U+002E | 임의의 문자를 찾음 |
| \ | 역슬래시 | U+005C | 문자의 특수 의미를 없앰 |
| | | 세로줄 | U+007C | 선택 |
| ^ | 악센트 기호 | U+005E | 행의 시작을 나타내는 앵커 |
| $ | 달러 기호 | U+0024 | 행의 끝을 나타내는 앵커 |
| ? | 물음표 | U+003F | 0번 또는 한 번을 나타내는 수량자 |
| * | 별표 | U+002A | 0번 이상을 나타내는 수량자 |
| + | 덧셈 기호 | U+002B | 한 번 이상을 나타내는 수량자 |
| [ | 왼쪽 대괄호 | U+005B | 문자 클래스 시작 |
| ] | 오른쪽 대괄호 | U+005D | 문자 클래스 끝 |
| { | 왼쪽 중괄호 | U+007B | 수량자 또는 블록 시작 |
| } | 오른쪽 중괄호 | U+007D | 수량자 또는 블록 끝 |
| ( | 왼쪽 소괄호 | U+0028 | 그룹 시작 |
| ) | 오른쪽 소괄호 | U+0029 | 그룹 끝 |
| 단축 문자1) | |
|---|---|
| 단축문자 | 설명 |
| \a | 벨 문자 |
| [\b] | 백스페이스 문자 |
| \c x | 제어 문자 |
| \d | 숫자 |
| \D | 숫자가 아닌 문자 |
| \d xxx | 문자의 10진수 값 |
| \f | 폼 피드 문자 |
| \h | 수평 공백 |
| \H | 수평 공백이 아닌 문자 |
| \r | 캐리지 리턴 |
| \n | 개행 문자 |
| \0xxx | 문자의 8진수 값 |
| \s | 공백 문자 |
| \S | 공백이 아닌 문자 |
| \t | 수평 탭 문자 |
| \v | 수직 탭 문자 |
| \V | 수직 탭이 아닌 문자 |
| \w | 영문자, 숫자, _, 기타 스크립트 문자 |
| \W | 영문자, 숫자, _, 기타 스크립트 문자를 제외한 문자 |
| \0 | 널 문자 |
| \x xx | 문자의 16진수 값 |
| \u xxx | 문자의 유니코드 값 |
| 정규표현식 옵션3) | ||
|---|---|---|
| 옵션 | 설명 | 지원 |
| (?d) | 유닉스 행 | 자바 |
| (?i) | 대소문자 구분 없앰 | PCRE, Perl, 자바 |
| (iJ) | 이름 반복 허용 | PCRE* |
| (?m) | 다중 행 | PCRE, Perl, 자바 |
| (?s) | 한 행(dotall) | PCRE, Perl, 자바 |
| (?u) | 유니코드 | 자바 |
| (?U) | 욕심쟁이 모드 해제 | PCRE |
| (?x) | 공백과 코멘트는 무시 | PCRE, Perl, 자바 |
| (?-…) | 옵션 기능 제거 | PCRE |
| Perl 변경자(플래그)4) | |
|---|---|
| 변경자 | 설명 |
| a | \d, \s, \w 및 ASCII 범위 내의 POSIX 문자 |
| c | 찾기 실패 후 현재 위치 유지 |
| d | 현재 플랫폼의 기본 설정 사용 |
| g | global 모드 설정 |
| i | 대소문자 구분 없앰 |
| l | 현재 로케일 설정 사용 |
| m | 다중 행 문자열 |
| p | 찾은 문자열을 저장 |
| s | 문자열을 한 행으로 간주 |
| u | 유니코드 규칙 사용 |
| x | 공백과 코멘트 무시 |
| 그룹 이름 지정 구문 | |
|---|---|
| 구문 | 설명 |
| (?<name>…) | 그룹 이름 지정 |
| (?name…) | 또 다른 그룹 이름 지정 |
| (?P<name>…) | 파이썬에서 그룹 이름 지정 |
| \k<name> | Perl에서 이름으로 참조 |
| \k'name' | Perl에서 이름으로 참조 |
| \g{name} | Perl에서 이름으로 참조 |
| \k{name} | .NET에서 이름으로 참조 |
| (?P=name) | 파이썬에서 이름으로 참조 |
| POSIX 문자 클래스 | |
|---|---|
| 문자 클래스 | 설명 |
| [[:alnum:]] | 영문자와 숫자 |
| [[:alpha:]] | 알파벳 문자(영문자) |
| [[:ascii:]] | ASCII 문자(모두 128) |
| [[:blank:]] | 빈 문자 |
| [[:ctrl:]] | 제어 문자 |
| [[:digit:]] | 숫자 |
| [[:graph:]] | 그래픽 문자 |
| [[:lower:]] | 소문자 |
| [[:print:]] | 인쇄 가능한 문자 |
| [[:punct:]] | 구두점 문자 |
| [[:space:]] | 공백 문자 |
| [[:upper:]] | 대문자 |
| [[:word:]] | 단어 |
| [[:xdigit:]] | 16진수 |
| 기본 수량자 | |
|---|---|
| 구문 | 설명 |
| ? | 0 또는 하나 |
| + | 하나 이상 |
| * | 0 또는 그 이상 |
| 게으른 수량자 | |
|---|---|
| 구문 | 설명 |
| ?? | 게으르게 0번 또는 한 번 |
| +? | 게으르게 한 번 이상 |
| *? | 게으르게 0번 이상 |
| {n}? | 게으르게 n번 |
| {n.}? | 게으르게 n번 이상 |
| {m,n}? | 게으르게 m부터 n까지 |
| 독정적인 수량자 | |
|---|---|
| 구문 | 설명 |
| ?+ | 독점적으로 0번 또는 한 번 |
| ++ | 독점적으로 한 번 이상 |
| *+ | 독점적으로 0번 이상 |
| {n}+ | 독점적으로 n번 |
| {n.}+ | 독점적으로 n번 이상 |
| {m,n}+ | 독점적으로 m에서 n까지 |
public static Boolean hasSpecialCharacter(String strPassword)
{
Boolean bHasSpecialCharacter = Pattern.matches("^(?=.*[\\x21-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7e]).{1,}", strPassword);
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("^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\\x21-\\x2f|\\x3a-\\x40|\\x5b-\\x60|\\x7b-\\x7e]).{10,16}", strPassword);
System.out.println(strPassword + ":" + bValid);
return bValid;
}
public static Boolean hasAlphabet(String strPassword)
{
Boolean bHasAlphabet = Pattern.matches("^(?=.*[a-zA-Z]).{1,}", strPassword);
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("^(?=.*[\\d]).{1,}", strPassword);
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("Your password is : " + strPassword);
hasAlphabet(strPassword);
hasDigit(strPassword);
hasSpecialCharacter(strPassword);
}
function hasAlphabet(strPassword: string) {
const reg = new RegExp("^(?=.*[a-zA-Z]).{1,}$")
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: string) {
const reg = new RegExp("^(?=.*[0-9]).{1,}$")
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: string) {
const reg = new RegExp("^(?=.*[\\x21-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7e]).{1,}$")
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: string) {
const reg = new RegExp("^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\\x21-\\x2f|\\x3a-\\x40|\\x5b-\\x60|\\x7b-\\x7e]).{10,16}$")
const bValid = reg.test(strPassword)
if(false === bValid) {
console.log(`${strPassword} is invalid.`)
} else {
console.log(`${strPassword} is valid.`)
}
return bValid
}
function testPassword(strPassword: string) {
console.log(`Your Password is : ${strPassword}`)
hasAlphabet(strPassword)
hasDigit(strPassword)
hasSpecialCharacter(strPassword)
isValidPassword(strPassword)
}
public static String getSnakeCaseFromCamelCase(String strCamelCase)
{
return strCamelCase.replaceAll("([A-Z])", "_$1").toLowerCase();
}
public static String getMacroCaseFromCamelCase(String strCamelCase)
{
return strCamelCase.replaceAll("([A-Z])", "_$1").toUpperCase();
}
function validateIBKCEOCard(strCardNumber: string) {
const regDigitsOnly = /(\D+)/gi
const strDigits = strCardNumber.replace(regDigitsOnly, "")
if (strDigits.length != 16) {
console.log(strCardNumber + ' is invalid card number')
return
}
console.log('validate IBK CEO Card: ' + strCardNumber + ' => ' + strDigits + '(' + strDigits.length + ')')
const regValidate: RegExp = /^943003|^552103\d+$/g
const bValid = regValidate.test(strDigits)
console.log('is valid? ' + bValid)
}