상세 컨텐츠

본문 제목

플레시 액션 스크립트 정규식 표현 패턴 or (문자열 나누기)

ADOBE/ ActionScript

by AlrepondTech 2020. 9. 21. 01:00

본문

반응형

 

 

=================================

=================================

=================================

 

 

 

출처 : http://dalparan.kr/?p=179 , http://dalparan.kr/?p=94

 

정규 표현식( Regular Expression )은 왠지 모르게 어렵다는 생각이 있었습니다. 어두운 저편에 무언가 있을 것 같아서 가지 못하는 느낌이랄까요. 서점에서 우연이 인사이트 에서 “손에 잡히는 정규 표현식” 이라는 책을 보고 바로 구입해서 읽고 있습니다. 그리 어렵지 않네요. 제가 머리가 그다지 좋지 않습니다만 이 정도는 이해가 됩니다. 책을 읽으면서 Flash Reference를 다시 보니 ”이걸 왜 몰랐을가?” 하는 생각이 드는군요. 관심이 없을 때는 “이게 머야?” 였던 내용이 관심을 가지고 보니 체계적으로 정리가 잘 되어 있네요. 꼭! 읽어 보시길 추천합니다.

어떤 경우 사용하면 좋은지부터 봅시다. 필요성을 못 느끼면 의미가 없죠. 대소문자를 구별하지 않고 in이라는 글자를 찾을경우 중간에 in이 들어가 있는경우를 제외( main, inability ) 하고 오로지 in만 찾는다면 어떻게 할가요? 특정 테크 안에 있는 문자열만 가져오고 싶다면요? 이메일 형식이 맞는지 검사하고 싶다면? 아이피 주소만 가져오고 싶다면? 등등 여러가지 경우에서 아주 유용하게 사용됩니다.

 

저 같은 경우 교육 Content에 많이 나오는 주관식 퀴즈에 사용합니다. “You can store a wide (variety) of data types in an (array) element, (including) numbers, strings, objects, and even other arrays.” 문장 중에 “(“ 와 “)” 사이의 단어를 찾아서 정답 배열에 넣어두고 단어를 Input TextField가 addChild된 Sprite Object를 좌표 위에 올립니다. Input TextField에 입력 한 단어와 정답 배열과 비교해서 정 오답을 구분합니다. 간단하게 아래 문장 중에 “(“ 와 “)” 사이의 단어를 찾는 함수를 하나 만들어 봅시다.

 

var str: String = "You can store a wide (variety) of data types in an (array) element, 
(including) numbers, strings, objects, and even other arrays.";

var findAry: Array = findStr(str, "(", ")");

trace("reslut :", findAry); // reslut : variety,array,including

function findStr($str: String, $s: String, $e: String): Array

{

    var resultAry: Array = new Array();

    var ary: Array = $str.split($s);

    var len: int = ary.length;

    for (var i: int = 1; i < len; i++) {

        var sAry: Array = ary[i].split($e);

        resultAry.push(sAry[0]);

    }

    return resultAry;

}

 

이걸 정규 표현식을 사용 하여 찾아봅시다.

var str: String = "You can store a wide (variety) of data types in an (array) element, 
(including) numbers, strings, objects, and even other arrays.";

var pattern: RegExp = /(?<=\().*?(?=\))/g;

findAry = str.match(pattern);

trace("reslut :", findAry); // reslut : variety,array,including

 

다른 방식으로 정답을 찾아 습니다. 이번에는 “jean = $300 computer = $5,000″ 문장 중에 $뒤에 가격만 찾아봅시다.

var price: String = "jean = $300 computer = $5,000";

findAry = findStr(price, "$", " ");

trace("reslut :", findAry); // reslut : 300,5,000

//정규 표현식

var pattern2: RegExp = /(?<=\$)[0-9,]+/g;

findAry = price.match(pattern2);

trace("reslut :", findAry); // reslut : 300,5,000

함수 하나를 만들어서 사용하니 코드양은 같습니다. 그런데 만약에 price가 space가 없다면 함수만으로는 찾을 수 없습니다. 정규 표현식 방법은 아무런 상관없이 찾아줍니다. 그리고, $를 포함해서 찾아야 한다면, 정규 표현식 같은 경우는 /[$][0-9,]+/g 이렇게 바꾸어주면 됩니다. 상당이 유용하고 어렵지 않습니다.

RegExp 객체 생성하는 방법

1. RegExp클래스에서 생성하는 생성자를 이용하는 방법

var 인스턴스명: RegExp = new RegExp( 정규표현식, flag );
var pattern: RegExp = new RegExp( “[a-z]{2, 6}”, g );

2. 문자표기법( 사용하려는 문자열, 숫자등을 직접 넣는 방법)을 사용하는 방법

 

 

 

 

var 인스턴스명: RegExp = /정규표현식/flag;
var pattern: RegExp = /[a-z]{2, 6}/g;

실무에서는 이 방법을 많이 사용합니다. /로 시작해서 /로 구문을 끝냅니다. /정규표현식/이렇게 들어가게 됩니다. /끝내는 구문 뒤에는 flag를 사용할수 있습니다. flag로는 g, i, m, s, x가 있습니다. 자세한 내용은 Flash Reference 확인하세요. 글을 쓰면서 이런 생각이 드네요. 정리된 글을 읽지 않아도 Flash Reference만 읽는다면 이 글은 의미가 없다라는…..^^;

정규표현식을 사용하는 method

1 . RegExp.test( str: String ): Boolean;

String tpye를 매개변수로 받아서 정규표현식의 패턴과 맞아 떨어지면 true, 아니면 false를 반환시켜준다.

var pattern: RegExp = /[a-z]+/;

var str: String = "dalparan";

trace(pattern.test(str)); //true

str = "35";

trace(pattern.test(str)); //false

str = "DAL";

trace(pattern.test(str)); //false

str = "DaL";

trace(pattern.test(str)); //true

2. RegExp.exec( str: String ): Object;

지정된 문자열 str에서 일반 표현식 검색을 수행합니다. 일반 표현식에 g(global) 플래그를 설정하지 않은 경우 문자열의 시작 부분(인덱스 위치 0)에서 검색이 시작되며 일반 표현식의 lastIndex 속성은 무시된다. 

var pattern: RegExp = /[a-z]+/ig;

var str: String = "There is no path no peace. Peaceis the path.";

var result: Object = pattern.exec(str);

while (result != null) {

    trace(result.index, "\t", pattern.lastIndex, "\t", result[0]);

    result = pattern.exec(str);

}

//0   5   There

//6   8   is

//9   11   no

//12   16   path

//17   19   no

//20   25   peace

//27   34   Peaceis

//35   38   the

//39   43   path

3. String.search( pattern:* ): int;

정규표현식의 패턴과 일치하는 하위 문자열의 Index 값을 반환하여 준다.

4. String.replace( pattern:*, repl: Object ): String;

정규표현식의 패턴과 일치하는 하위 문자열을 대체( replace )하여 준다.

5. String.match( pattern:*): Array;

전역 flag으로 설정 되어 있을 때 일치하는 하위 문자열을 배열로 반환하여 준다.

문자열 method 관련해서는 http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/String.html 보시는게 좋습니다.

 

 

반응형

 

728x90

 

 

 

정규 표현식 사용하기

1. 문자 하나 찾기

마침표(.) 문자는 아무 문자 하나와 일치 합니다. 표현식을 c.t라고 하면 cat, cot, cet등을 찾아줍니다. 문자열중에서 마침표(.)를 찾고 싶다면 역슬래시(\).을 사용하면 됩니다. 즉, /cat\./라고 한다면 cat. 인 문자열을 찾아줍니다.

2. 문자 집합으로 찾기

대괄호([])는 문자 집합을 의미 합니다. 표현식을 [ma]s.라고 하면 첫 글자 중에 m이나 a로 시작하며 두 번째 글자는 s이고 세 번째는 아무 문자 일 경우 찾아줍니다. [Rr]egexp라고 한다면 첫 글자가 대문자 R이나 소문자 r로 시작하며 뒤에 문자열과 일치 하는 문자열을 찾아 줍니다. [0123456789]m이라고 한다면 첫 글자가 숫자 0~9까지 한 개가 일치 하고 다음 글자가 m일 경우 찾아줍니다. [0123456789] 는 [0-9]와 같고 [a-z]는 [abced 부터 xyz] 와 같습니다. [1-4]나 [c-e]이렇게 하여도 됩니다. 대괄호([])안에 케럿(^)를 사용하면 지정한 문자들을 제외한 나머지를 찾습니다.

3. Meta-Character 사용하여 찾기 

var myAry: Array = new Array();
//
if (myAry[0] == 0) {
//    
}

//
var pattern: RegExp = /myAry[0]/;

var pattern: RegExp = /myAry\[0\]/;

var pattern: RegExp = /myAry\[[0-9]\]/;

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

위와 같은 구문에서 myAry[0]을 찾으려고 합니다. var pattern: RegExp = /myAry[0]/; 이렇게 하면 myAry0를 찾습니다. 그래서 var pattern: RegExp = /myAry\[0\]/; [앞에 \(escape)를 넣어주어 myAry[0]을 찾습니다. maAry[숫자하나]를 찾는다면 var pattern: RegExp = /myAry\[[0-9]\]/; 하여 주시면 됩니다. 왼쪽 그림과 같이 숫자 메타 태그를 사용한다면 var pattern: RegExp = /myAry\[\d\]/; 하시면 됩니다. 왼쪽 그림과 같이 영숫자 메타 문자를 사용하시면 var pattern: RegExp = /[\w] [\w] [\w] [\w] [\w]\[\d\]/;를 하시면 됩니다.

 

RegExp Class – 2 에서 다룰 내용입니다.

반복 찾기, 위치 찾기, 하위 표현식 사용하여 찾기, 역참조 사용하여 찾기, 전방탐색과 후방탐색, 조건달기

반복 찾기

문자나 집합 속에 속한 요소( instance )를 하나 이상을 찾으려면 문자 뒤에 더하기(+)를 사용합니다.

var str: String = "This is a dalparan example.";

var pattern: RegExp = /\w+/g;

var ary: Array = str.match( pattern );

trace( ary );//output : This,is,a,dalparan,example

\w은 대소문자 밑줄을 포함하는 모든 영숫자([a-zA-Z0-9_])와 같습니다. 더하기(+) 추가 되었네요. 공백은 포함이 되어 있지 않으므로 This까지만 일치 합니다. 표현식 뒤에 g가 붙어서 global flag가 true가 됩니다. String.match() method는 Global flag가 true이면 문자열의 시작 부분(인덱스 위치 0)에서 검색이 시작됩니다. 일반 표현식의 일치하는 항목이 배열에 추가되고 다음 인덱스 위치에서 검색이 진행됩니다. 메서드 실행이 완료되면 일반 표현식의 lastIndex속성이 0으로 설정됩니다. ary 배열에 밑줄을 포함한 모든 영숫자를 하나씩 찾아가면서 일치 하지 않는 공백이 나오면 다음을 찾습니다. 그래서, This,is,a,dalparan,example받아 배열에 넣습니다.

 

var email: String = "I have two e-mail. dalparan@dalparan.kr and lack07@lycos.co.kr";

var pattern: RegExp = /\w+@\w+\.\w+/ig;

var ary: Array = email.match(pattern);

trace(ary); //output : dalparan@dalparan.kr,lack07@lycos.co

pattern = /\w+[\w.]*@[\w.]+\.\w+/ig;

ary = email.match(pattern);

trace(ary); //output : dalparan@dalparan.kr,lack07@lycos.co.kr

위에서 \w+를 응용하여 봅시다. 문자열중에서 이메일 형식을 가진 문자열을 찾아 봅시다. 처음 정규 표현식을 보면 \w+@\w+\.\w+ 밑줄을 포함한 모든 영숫자를 하나씩 찾고 일치 하지 않는 @에서 일치 하지 않으므로 다음 표현식으로 갑니다. @이 문자 그대로 비교합니다. 그 후에 다시 밑줄을 포함한 모든 영숫자를 하나씩 찾고 일치하지 않는 .에서 다음 표현식 .을 찾고 밑줄을 포함한 모든 영숫자를 하나씩 찾고 끝을 냅니다. 이러면 lycos.co.kr에서 .kr은 검색하지 못합니다. 뒤에 주소가 .co.kr 이던 .com, .kr, org이던 검색을 하려면 \w+@[\w.]+\.\w+ 이렇게 하면 됩니다. @다음에 [\w.]+집합으로 정의합니다. [\w\.]+하고 같습니다. 밑줄포함 영숫자 . 을 반복적으로 검색합니다. Dalparan.co.kr.org.gg 이렇게 된 것까지도 일치하게 됩니다.

별표(*)는 주어진 문자가 있는 경우에는 일치시키는 메타 문자이고, 더하기(+)는 반드시 하나 이상 일치 해야 됩니다. 별표(*)는 일치 하는 텍스트가 있다면 일치 하지만, 반드시 있어야 되는 건 아닙니다. Flag에 i가 하나 더 있는데 이건 대소문자 구별 하지 않고 검색하여 반환해줍니다.

var str: String = "my homepage is http://dalparan.kr/ or https://dalparan.kr";

var pattern: RegExp = /https?:\/\/[\w.\/]+/ig;

var ary: Array = str.match( pattern );

trace( ary );//output : http://dalparan.kr/,https://dalparan.kr

물음표(?)는 문자 묶음 안에서 있는지 없는지 알 수 없는 경우 문자를 하나만 찾을 때 사용합니다. 물음표(?)는 자기 앞에 있는 문자가 없거나 그 문자 하나만 있을 경우 일치 합니다. http:// 나 https:// 와 일치 하지만 그 외에는 일치하지 않습니다.

var str: String = "<font color='#FF6600'>dalparan</font>"

var pattern: RegExp = /#[a-f0-9]{6}/ig;

var ary: Array = str.match( pattern );

trace( ary );//output : #FF6600

#[a-f0-9] [a-f0-9] [a-f0-9] [a-f0-9] [a-f0-9] [a-f0-9]을 {interval}을 사용하여 #[a-f0-9]{6} 찾을 수 있습니다. 중괄호{}는 구간을 나타냅니다.

var str: String = "10-08-2009, 1/2/9, 09/16/09, 08/12/2009"

var pattern: RegExp = /\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}/g;

var ary: Array = str.match( pattern );

trace( ary );//output : 10-08-2009,09/16/09,08/12/2009

pattern = /\d{1,2}[-\/]\d{1,2}[-\/]\d{4}/g;

ary = str.match( pattern );

trace( ary );//output : 10-08-2009,08/12/2009

결과를 보시면 아시겠지만 \d{2,4} 이 부분 때문에 \d을 2개부터 4개 가진걸 찾아줍니다. 1/2/9는 9가 그에 일지 하지 않아서 찾지 못하는 것입니다. \d{4} 부분 때문에 09/16/90을 찾아내지 못하는 경우와 같습니다.

var str: String = "m1=235.34, m2=3.41, m3=3.55, m4=32.65, m4=32175.65";

var pattern: RegExp = /\d{3,}\.\d{2}/g;

var ary: Array = str.match( pattern );

trace( ary );//output : 235.34,32175.65

pattern = /\w\d=\d{3,}\.\d{2}/g;

ary = str.match( pattern );

trace( ary );//output : m1=235.34,m4=32175.65

\d{3,}은 3개부터 그 이상 되는 구간을 검색하여 찾아줍니다. 결국, {}은 구간 검색이라고 생각하시면 되겠네요. {4}정확한 구간, {3,7}범위구간, {2,}최소 구간 찾기가 됩니다.

var str: String = "This expression validates (telephone) numbers. From (time) to time";

var pattern: RegExp = /\(.*\)/g;

var ary: Array = str.match( pattern );

trace( ary );//output : (telephone) numbers. From (time)

pattern = /\(.*?\)/g;

ary = str.match( pattern );

trace( ary );//output : (telephone),(time)

(영 단어) 을 찾으려 합니다. 처음 정규식은 처음 괄호부터 마지막 괄호까지 찾아줍니다. 두 번째 정규식은 첫 번째 정규식에 ?만 추가 한 상황입니다. 원하는 대로 찾아주는군요. 물음표(?)는 없거나 하나만 있을 때 일치 시켜준다고 했었는데 기능이 하나 더 추가되겠네요. 제한된 범위만큼 일치시켜주는 기능입니다.

위치 찾기(position matching)

var str: String = "timer is time. sometime some time";

var pattern: RegExp = /\btime/g;

var ary: Array = str.match(pattern);

trace(ary); //output : time,time,time

pattern = /time\b/g;

ary = str.match(pattern);

trace(ary); //output : time,time,time

pattern = /\btime\b/g;

ary = str.match(pattern);

trace(ary); //output : time,time

pattern = /\Btime/g;

ary = str.match(pattern);

trace(ary); //output : time

pattern = /time\B/g;

ary = str.match(pattern);

trace(ary); //output : time

pattern = /\Btime\B/g;

ary = str.match(pattern);

trace(ary); //output :

/b는 ^\w과 \W(영숫자, 밑줄인 아닌 모든 문자[^a-zA-Z0-9_])인 것과 일치합니다. /B는 \w(영숫자, 밑줄을 포함하는 모든 문자[a-zA-Z0-9_])와^\W인 것과 일치 시켜줍니다. 처음 정규식은 /b만 앞에 있습니다. \W와 일치 하는 것을 찾아서 (1)timer is (2)time. (3)Sometime some (4)time 중에서 3번을 제외한 나머지를 찾아서 반환합니다. 두 번째는 뒷부분에 \b가 있어서 1번의 제외한 나머지를 찾아서 반환합니다. 세 번째는 양쪽으로 \b가 있어서 2와4만 반환 합니다. 네 번째는 \B가 앞에 있어서 3만 반환 합니다. 다섯 번째는 뒤에 \B가 있어서 1번만 반환 합니다. 여섯 번째는 앞뒤로 \B가 있어서 일치하는 것이 없습니다. 캐럿(^)은 각 문자열의 경계 중 문자열의 시작 부분을 나타냅니다. 달러($)는 문자열의 경계 중 문자열의 끝 부분을 나타냅니다.

하위 표현식 사용하여 찾기(역 참조, 치환, 전후방탐색, 조건)

하위 표현식(subexpression)은 정규 표현식 안에서 표현식의 묶음 정도로 생각하시면 됩니다. ()안에 표현식을 사용합니다. “timetime is gold” 문장 중에 timetime을 찾아서 time로 바꾸려 합니다. 찾아봅시다. /time{2}/이 러면 될 가요? Timee와 일치 하는 표현식이 됩니다. 그러면 어떻게 할가요? 바로 이렇게 하시면 됩니다. /(time){2}/는 timetime와 일치 합니다. 하위 표현식은 그안에 다시 하위 표현식을 사용 할수 있습니다. IP주소를 찾는 방법을 봅시다. IP주소는 0~255.0~255.0~255.0~255로 표현됩니다. 한자리나 두 자리는 그래도 찾아도 상관없군요. 문제는 세 자리수가 될 경우 2[0-4][0-9] 이고 25[0-5]가 되어야 합니다.

var pattren: RegExp = /(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.)
                       {3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))/;

복잡해 보이지만 괄호 기준으로 하나씩 보시면 어렵지 않습니다. 하위 표현식을 사용하게 되면 역참조, 치환, 전후방탐색, 조건 달기 등이 가능해집니다. 아래와 같습니다.

var str:String = "flip-flop";

var pattern:RegExp = /(\w+)-(\w+)/ig;

trace(str.replace(pattern, "$2-$1"));//output : flop-flip

str = "Not a must and a quick...<font>I think the benefit of (Regexp) goes down the more of them you are using</font> I recommend, strongly....";

pattern = /<(font)>.*?<\/\1>/ig;

trace( str.match( pattern ) );

//output : <font>I think the benefit of Regexp goes down the more of them you are using</font>

pattern =/(?<=\()\w+/ig;

trace( str.match( pattern ) );//output : Regexp

pattern =/\w+(?=\))/ig;

trace( str.match( pattern ) );//output : Regexp

pattern =/(?<=\()\w+(?=\))/ig;

trace( str.match( pattern ) );//output : Regexp

pattern =/(?<!\()\w+/ig;

trace( str.match( pattern ) );

pattern =/\w+(?!\))/ig;

trace( str.match( pattern ) );

pattern =/(?!=\()\w+(?!\))/ig;

trace( str.match( pattern ) );

//output : 3개다 ., <>, Regexp 제외한 나머지 모두

조건으로 찾기는 (?(backreference)true), (?(backreference)true|false) 을 사용합니다.

var str:String = "02-234-3483 (02)342-5876 (032)-341-4957";

var pattern:RegExp = /(\()?\d{2,3}(?(1)\)|-)\d{3,4}-\d{4}/ig;

trace( str.match( pattern ) );//output : 02-234-3483,(02)342-5876

국번을 괄호”()”로 감싸거나 뒤에 하이픈”-“을 사용한 것만 찾는 식입니다. 문법을 생각 하시면서 하나씩 분리해서 보시면 됩니다. (\()? “(“ 있거나 없거나, \d{2,3} 숫자가 2자리 수이거나 3자리 수이거나, (?(1)\)|-) 이 부분이 조건문 입니다. 첫 번째 하위 표현식 즉, (\() 있으면 \)과 일치 하고, 없으면 – 과 일치합니다.  

 

 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역