테스트 사이트 - 개발 중인 베타 버전입니다

[정규식] 재미난? 정규식 Again #15 - 유니코드

· 5년 전 · 1396

한글 멘션을 할려고 하다 보면, 한글 초성 처리가 중요한것 같습니다.

 

아래는 냑에 있는 정규식 코드의 일부입니다.

 

[code]

matcher: function(flag, subtext, should_startWithSpace, acceptSpaceBar) {

    flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

    if (should_startWithSpace) {

        flag = '(?:^|\\s)' + flag;

    }

    _a = decodeURI("%C3%80");

    _y = decodeURI("%C3%BF");

    space = acceptSpaceBar ? "\ " : "";

    regexp = new RegExp(flag + "([가-힣ㄱ-ㅎA-Za-z" + _a + "-" + _y + "0-9_" + space + "\'\.\+\-]*)$|" + flag + "([^\\x00-\\xff]*)$", 'gi');

    match = regexp.exec(subtext);

[/code]

 

1. flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

  -, [, ], /, {, }, (, ), *, +, ?, ., \, ^, $, | 을 "\$&" 로 변경하는 것 같습니다.

2. 스페이스 시작하면 flag 에 ^ 또는 whitespace \s 를 flag 앞에 넣습니다.

    if (should_startWithSpace) {

        flag = '(?:^|\\s)' + flag;

    }

3. 에서  까지의 한글

    _a = decodeURI("%C3%80");

    _y = decodeURI("%C3%BF");

4. 스페이스를 포함하면 "\ " 아니면 empty ""

space = acceptSpaceBar ? "\ " : "";

5. ([가-힣ㄱ-ㅎA-Za-z" + _a + "-" + _y + "0-9_" + space + "\'\.\+\-]*)$|

를 정리하면 ([가-힣ㄱ-ㅎA-Za-z쎀-쎿0-9_\ \'\.\+\-]*)$|

6. ([^\x00-\xff]*)$  은 Ascii char 0x00 에서 0xff까지가 아닌것이네요.

 

대략 정리하면 아래와 같이 되겠네요

[code]

(?:^|\\s)([가-힣ㄱ-ㅎA-Za-z쎀-쎿0-9_\ \'\.\+\-]*)$|(?:^|\\s)([^\x00-\xff]*)$

[/code]

?:  ( )으로 그룹으로 지정하지 말라는 이야기 입니다.

^: 시작표시

|: OR

\s: whitespace입니다. Space, tab, line feed (newline), carriage return, form feed, and vertical tab

가-힣: 모든 한글

ㄱ-ㅎ: 초성

A-Z: 영문 대문자

a-z: 영문 소문자

0-9: 숫자

_, 스페이스, ', ., +,- 의 특수문자 중 하나입니다.

 

아래의 테스트글을 가지고 https://regex101.com/ 에서 테스트해보니

6번은 한글이 아닌 경우를 잡아 주는 것 같습니다.

앞부분이 한글, 영문, 숫자, 특수기호 조합을 잡아줍니다.

중간에 스페이스를 포함시킬지 말지에 따라 포함되고 안되고.

 

1번줄의 의미는 정확하게 모르겠습니다.

------------------------------

한글 테스트
test

t한글

0한글

닉_네.임'+_
你好
こんにちは

亞波治

------------------------------

 

질문 숫자와 특수기호만 빼고 모든 유니코드를 지원하는 정규식은?

 

추신: 1번줄의 의미를 알려주시면 감사하겠습니다. 

 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

게시글 목록

번호 제목
10793
10783
10781
10777
10775
10761
10757
10748
10743
10740
10725
10723
10718
10711
10705
10682
10665
10657
10645
10643
10641
10630
10624
10609
10605
10597
10590
10580
10579
10576