코딩 공부/공부

정규표현식 (Regular Expression: Regex)

fullfish 2022. 4. 21. 16:19

형식

/pattern/flag

 

//예시 문자열
let str = "안녕하세요 안녕 제 전화번호는 010-1234-5678입니다 G gd god good goood!.";
패턴 의미 비고
[a-z] [A-Z] 알파벳 범위  
[ㄱ-ㅎ] [가-힣] 한글 범위  
0-9 숫자 범위  
. 모든 문자열 (공백 포함, 줄바꿈은 x) 1개당 문자열한개. ...은 3자리의 문자열
\d 숫자 str.match(/\d/) === '0'
\D 숫자 아닌거  
\w 알파벳, 숫자, _ 영문 대소문자 52개 + 숫자 10개 + _  1개 =63개 문자
\W \w 제외  
\s 공백  
\S 공백 아닌것  
^ 줄의 시작에서 일치 e.g. /^abc/   시작 포함돼야함
[^] 부정(not)  
$ 줄의 끝에서 일치 e.g. /abc$/   끝 포함돼야함
/goood!\.$/ 마지막 찾으려면 이렇게 써야함 .도 의미를 가지고 있기에 앞에 \를 붙여서 뒤의문자가 단순 문자라고 선언해줘야함
| 또는 str.match(/안|/녕/) === '안'
[] 괄호안 문자들 중 하나 /[안녕하]/ === /안|녕|하/
[^문자] 해당 문자 제외 'abcde'.replace(/[^ace]/g,' ') === 'a c e'
\b 단어의 처음/끝, 한글안됨
/\b0/ : 단어 시작, /0\b/ : 단어 끝
str.match(/\b0/) === 0 (index : 17)
한글은 인식못하는데 못찾음
\B 단어의 처음/끝이 아님 /0\b/처럼 문자를 앞에다가는 못쓰는거 같고 한글은 그냥 \B자체를 인식못해서 해당 글자를 찾아버림
* ==={0,} 0회 이상 연속으로 반복되는 문자와 가능한 많이 일치 str.match(/go*/g) === ['g', 'go', 'goo', 'gooo']
str.match(/.*/) === ['안녕하세요 안녕 제 전화번호는 010-1234-5678입니다 good!.']
*? === {0} 0회 이상 연속으로 반복되는 문자와 가능한 적게 일치 str.match(/go*?/g) === ['g', 'g', 'g', 'g']
str.match(/.*?/) === ['']
+ === {1,} 1회 이상 연속으로 반복되는 문자와 가능한 많이 일치 str.match(/go+/g) === ['go', 'goo', 'gooo']
str.match(/.+/) === ['안녕하세요 안녕 제 전화번호는 010-1234-5678입니다 good!.']
+? === {1} 1회 이상 연속으로 반복되는 문자와 가능한 적게 일치 str.match(/go+?/g) === ['go', 'go', 'go']
str.match(/.+?/) === ['안']
? 없거나 1회 가능한 많이 일치 str.match(/go?/g) === ['g', 'go', 'go', 'go']
str.match(/.?/) === ['안']
?? 없거나 1회 가능한 적게 일치 str.match(/go??/g) === ['g', 'g', 'g', 'g']
str.match(/.??/) === ['']
\u 유니코드 문자에 일치 /\u0061/.test('a') //true

 

 

플래그 의미 비고
i Ignoer Case 대소문자 구분 안하고 검색
g Global 문자열 내의 모든 패턴 검색
m Multi Line 문자열의 행이 바뀌더라도 검색
u unicode /😀{2,}/u.test("😀😀") // true
u안붙이면 flase
그런데 {2,}말고 정확히 일치나 {1,}, {1}같은거는 true뜨는데... 확실하게 하기위해 u붙여주자

 

 

메소드 의미  비고
정규식.exec(문자열) 일치하는 하나의 정보(Array) 반환 /안/.exec(str) === ['안'] 
// g를 붙여도 결과값은 하나나옴
정규식.test(문자열) Boolean 반환  
문자열.match(정규식) 일치하는 문자열의 배열 반환 str.match(/안/) === /안/.exec(str)
문자열.search(정규식) 일치하는 문자열의 인덱스 반환 str.search(/안/) === 0
// g를 붙여도 결과값은 하나 나옴
문자열.replace(정규식, 대체문자) 일치하는 문자열을 대체문자열로 변환 str.replace(/안/g,10) === '10녕하세요 10녕 제 전화번호는 010-1234-5678입니다 good!.'
// g 정상 작동
문자열.split(정규식) 일치하는 문자열을 분할하여 배열로 반한 str.split(/안/) === str.split('안') ===
[ '', '녕하세요 ', '녕 제 전화번호는 010-1234-5678입니다 good!.' ]
g안붙여도 전역
고급    
문자열.replace(regexp | substr,
newSubstr | funtion)
공식문서 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_function_as_a_parameter 두번째 인자로 함수를 쓴다면 함수의 매개변수는 match, p1,p2..., offset, string 이다
match는 검색이 된 부분,
p1, p2는 캡쳐된 각 요소들,
offset은 match의 첫 인덱스,
string은 조사된 전체 문자열
'부산광역시'.replace(/(부).*?(광)/,(match, ...groups) =>{ 
console.log(match) // "부산광"
console.log(groups) // ['부', '광', 0, '부산광역시']

 

자주 쓰는  정규표현식
구문 의미
/^word/ 특정 단어로 시작하는지
/word$/ 특정 단어로 끝나는지
/^d+$/ 모두 숫자인지
/^[\s]+/ 하나 이상의 공백으로 시작하는지 (공백 문자 : \t, \r, \n, \v, \f)
/^[A-Za-z0-9]{4,10}$/ 아이디 사용 가능한지 (알파벳 대,소문자or숫자로 시작하고 끝나며 4~10자리인지)
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/ 메일 주소 형식 검사
/^\d{3}-\d{3,4}-\d{4}$/ 핸드폰 번호 형식
/[^A-Za-z0-9]/gi 특수 문자 포함 됐는지
/[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/gi 특수 문자 포함 됐는지 (선별적 검색 가능)

 

 

사용 예시 결과
str.match(/[0-9]/g) ['0', '1', '0', '1', '2', '3', '4', '5', '6', '7', '8']
str.match(/[0-9]+/g) ['010', '1234', '5678']
str.match(/[0-9-]+/g) ['010-1234-5678']
str.match(/0+|1+|2+|3+|4+|5+|6+|7+|8+|9+/g)
['0', '1', '0', '1', '2', '3', '4', '5', '6', '7', '8']

참고 

https://heropy.blog/2018/10/28/regexp/

 

정규표현식, 이렇게 시작하자!

매일 쓰는 것도, 가독성이 좋은 것도 아니지만, 모르면 안되는 정규표현식. 저는 이렇게 공부하기 시작했습니다! (자바스크립트를 기준으로 설명합니다)

heropy.blog

https://curryyou.tistory.com/234

 

[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코

# 정규표현식이란?(Regular Expression: Regex) 정규표현식은 "특정 패턴의 문자열"을 찾기 위한 표현 방식입니다. (이런걸 형식 언어, formal languange라고 합니다.) 정규표현식을 이용하면, 특정 패턴에 매

curryyou.tistory.com