-
누구나 쉽게 익히자. 자바 스크립트 정규식 ..!!Programming/JAVASCRIPT 2010. 5. 12. 15:54
차례
- 1. 정규식이란?
- 2. 정규식 만들기
- 3. 정규식 표현법
- 4. 정규식 사용 예제
- 5. Javascript 정규식 함수
- 6. 정규식으로 만든 유용한 Javascript 함수
- 7. Java 정규식 함수
1. 정규식이란?
- String의 검색,치환,추출을 위한 패턴.
- 언어별 사용법은 대동소이함.
- 패턴예>전화번호 형식, 이메일 형식 등.
2. 정규식 만들기
- Javascript
-
var regexp = /pattern/[flags] ;
var test = regexp.test(to be checked) -
var regexp = new RegExp("pattern"[, "flags"]);
var test = regexp.test(to be checked) - flags for javascript
- g : global match, 일반적으로 패턴이 1번만 발견되면 찾기를 종료하지만, g flag가 있으면, 문자열 내에서 모든 패턴을 찾는다.
- i : ignore case, 대소문자를 고려하지 않고 체크한다.[a-z]와 [A-Z]는 같은 표현이 된다.
- m : match over multiple lines, 여러 줄에 걸쳐 체크를 한다.
-
- Java
- java.util.regex package
-
Pattern p = Pattern.compile("pattern");
Matcher m = p.matcher("string to be checked");
boolean b = m.matches(); -
boolean b = Pattern.matches("pattern", "string to be checked");
3. 정규식 표현법
*ⓥ는 valid, ⓘ는 invalid
*두꺼운 글씨체는 매칭되는 부분.
*예제는 javascript 기준이며, 언어에 따라 다소 차이가 발생할 수 있다.
문자 용도 예제 \ - 특수문자를 의미
- 특수문자의 사용을 제외(특수문자 앞에서)
- b는 b라는 글자를 의미 하지만 \b는 단어 경계를 의미
- *은 0번이상 반복이라는 의미이지만, \*는 *이라는 글자를 의미.
^ 문자열의 시작. []안에서는 not의 의미
* ^A는 "A로 시작"이라기 보다는 "시작 직후에 A가 나온다"는 의미로 해석하는 것이 좋다. 즉, 시작과 끝과 같은 빈 공간을 하나의 문자로 간주하는 것이 좋다./^A/g - A stringⓥ
- an Aⓘ
- A stringⓥ
- an Aⓥ
$ 문자열의 마지막 /t$/ - eatⓥ
- GREATⓘ
* 0번 이상 반복 /ab*d/g - adⓥ
- abdⓥ
- abdcdeabbbbdedbⓥ
- abⓘ
- axdⓘ
+ 1번 이상 반복 ( = {1,} ) /ab+d/g - adⓘ
- abdⓥ
- abdcdeabbbbdedbⓥ
- abⓘ
- axdⓘ
? 0번 이나 1번 /e?le?/g - angelⓥ
- angleⓥ
- elementⓥ
- abc-dⓥ
- abcdⓥ
. new line 을 제외한 모든 글자 /.n/g - nay, an apple is on the treeⓥ
- nayⓘ
(x) x를 체크하고 체크한 값을 변수로 저장 /(f..) (b..)/ - foo barⓥ
1th :foo
2th :bar
(?:x) x를 체크하고 체크한 값을 변수로 저장하지 않음 /(?:f..) (b..)/
- foo barⓥ
1th :bar
- bar fooⓘ
x|y x 또는 y /green|red/ - green appleⓥ
- red appleⓥ
- yellow appleⓘ
x(?=y) x후에 y가 나오고, x부분만 매칭되는 부분으로 간주 /blah(?=soft|hard)/ - blahsoftⓥ
- blahhardⓥ
- blah softⓘ
- blahsoftⓥ
- blahhardⓘ
- blah softⓘ
x(?!y) x가 나오고 그 뒤에 y가 있으면 안 됨 /blah(?!hard)/ - blahsoftⓥ
- blahhardⓘ
- blah softⓥ
{n} 앞에 지정한 것이 n개 /.{3}/ - abⓘ
- abcⓥ
- abcdⓥ
- 홍길동ⓥ
{n,} 앞에 지정한 것이 n개 이상 /.{3,}/ - abⓘ
- abcⓥ
- abcdⓥ
{n,m} 앞에 지정한 것이 n~m개 /.{3,5}/ - abⓘ
- abcⓥ
- abcdⓥ
- 홍길동ⓥ
[xyz] x나 y나 z. []안에는 얼마든지 쓸 수 있다. /[abc]{2}/ - abⓥ
- abcⓥ
- adbdⓘ
[x-z] x에서 z까지 /[a-z]{4,}/g - She sells sea shells by the sea shore는 Very 어렵다!ⓥ
[^xyz] x,y,z를 제외한 나머지 모든 것 /[^a-z]{2,}/g - I'm a good manⓥ
- I am A good Manⓥ
[\b] 백스페이스. \b와 혼동하지 말것. /[\b]/g - abcdⓥ
\b 단어의 경계.[\b]와 혼동하지 말것. /\bn[a-z]/g - I am not a boyⓥ
- onlineⓘ
- nopeⓥ
\B \b 를 제외한 전부 /\Bn[a-z]/g - noondayⓥ
- onlineⓥ
- nopeⓘ
\cX 컨트롤X와 매칭. \cM은 컨트롤M과 매칭 \d 숫자.[0-9]와 같음 /\d/g - 7 eight 9ⓥ
- 123ⓥ
- 0120ⓥ
- 12011ⓘ
\D \d 를 제외한 전부 /\D/g - 7 eight 9ⓥ
- 12?3ⓥ
\f form-feed \n new line \r carriage return \s white space
ex>탭, 띄어쓰기, \n, \r/k\s/g - koreaⓘ
- blank isⓥ
- blankⓘ
\S \s 를 제외한 전부 /k\S/g - koreaⓥ
- blank isⓘ
\t 탭 \v vertical tab \w 알파벳+숫자+_. [A-Za-z0-9_]와 동일 /\w/g - !@#$%^&*()+_-[]{}\|"':;,.<>?/ⓥ
\W \w 빼고 전부 /\W/g - !@#$%^&*()+_-[]{}\|"':;,.<>?/ⓥ
\n \n이 자연수일때, ()로 지정한 n번째 정규식 /(.{2})e tru\1 is \1at/ - the truth is that ...ⓥ
1th :th
\xhh hh는 hexacode, /[\x21-\x40]/g - !@#$%^&*()poⓥ
\uhhhh hhhh는 hexacode, /[\u3131-\u3163\uac00-\ud7a3]/g - 나는 blah 직원입니다.ㅋㅋⓥ
4. 정규식 사용 예제
/^[0-9]/ - 09없다ⓥ
- 100점ⓥ
- 집이 10평ⓘ
/^\w+$/ - blahsoftⓥ
- blah(co)ⓘ
- blah softⓘ
/^[a-zA-Z][\w\-]{4,11}$/ - blah2010ⓥ
- blah-2010!ⓘ
- 2010blahⓘ
- ILikegoooooooooooooooooogleⓘ
/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/ - 02-6288-2114ⓥ
- 031-779-7114ⓥ
- 12-1234-5678ⓥ
- 02-6288-2114545ⓥ
- 02-0288-2114ⓥ
/^0\d{1,2}-[1-9]\d{2,3}-\d{4}$/ - 02-6288-2114ⓥ
- 031-779-7114ⓥ
- 12-1234-5678ⓘ
- 02-2123-12314545ⓘ
- 02-0288-2114ⓘ
/^[\.a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/ - r-d.blah.co.krⓥ
- r-d.blah.co.kr입니다.ⓥ
- blah..co.krⓥ
- a.comⓥ
/^(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/ - r-d.blah.co.krⓥ
- r-d.blah.co.kr입니다.ⓘ
- blah..co.krⓘ
- a.comⓘ
/^[_a-zA-Z0-9\-]+@[\._a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/ - abc@haha.co.krⓥ
- abc@haha..co.krⓥ
- hwang@a.comⓥ
/^[\w\-]+@(?:(?:[\w\-]{2,}\.)+[a-zA-Z]{2,})$/ - abc@haha.co.krⓥ
- abc@haha..co.krⓘ
- hwang@a.comⓘ
/^([a-z]+):\/\/((?:[a-z\d\-]{2,}\.)+[a-z]{2,})(:\d{1,5})?(\/[^\?]*)?(\?.+)?$/i - http://www.blah.co.kr/main/index.jsp?var=valueⓥ
1th :http
2th :www.blah.co.kr
3th :
4th :/main/index.jsp
5th :?var=value
- http://www.blah.co.kr/main/index.jspⓥ
1th :http
2th :www.blah.co.kr
3th :
4th :/main/index.jsp
5th :
- http://blah.co.kr/ⓥ
1th :http
2th :blah.co.kr
3th :
4th :/
5th :
- http://blah.co.krⓥ
1th :http
2th :blah.co.kr
3th :
4th :
5th :
- http://blah.co.kr:8088/main/ⓥ
1th :http
2th :blah.co.kr
3th ::8088
4th :/main/
5th :
/^[ㄱ-ㅣ가-힣]+$/ - 티맥스소프트ⓥ
- ㅜㅜⓥ
- ㅎㅎⓥ
5. Javascript 정규식 함수
함수 코드예제 코드설명 Array RegExp.exec (to be checked) var myRe=/d(b+)(d)/ig;
var myArray = myRe.exec("cdbBdbsbz");/d(b+)(d)/ig
- cdbBdbsbzⓥ
myArray.index =1 ; (처음으로 매칭되는 위치, 컴터가 늘 그렇듯 위치는 0번째부터 센다.)
myArray.input = cdbBdbsbz; (체크할 대상)
myArray[0] = dbBd;(검사에 통과한 부분)
myArray[1] = bB;(1번째 괄호에서 체크된 부분)
myArray[2] = d;(2번째 괄호에서 체크된 부분)
myRe.lastIndex =5 ; (다음번 체크를 하기위한 위치.)
myRe.ignoreCase = true; (/i 플래그 체크)
myRe.global = true; (/g 플래그 체크)
myRe.multiline = false; (/m 플래그 체크)
RegExp.$_ = cdbBdbsbz;(입력한 스트링)
RegExp.$1 = bB;(1번째 괄호에서 체크된 부분 )boolean RegExp.test(to be checked) var myRe=/d(b+)(d)/ig;
var checked = myRe.test("cdbBdbsbz");
document.write("checked = " + checked +";<br>");/d(b+)(d)/ig
- cdbBdbsbzⓥ
실행결과: checked = true; String RegExp.toString() var myRe=/d(b+)(d)/ig;
var str = myRe.toString();
document.write(str);실행 결과: /d(b+)(d)/ig String String.replace(pattern or string, to be replaced) 1. var str = "abcdefe";
document.write(str.replace("e" , "f"));
2.
var str = "aba";
document.write(str.replace(/^a/ , "c"));
3.
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
4.
var re = /\s(?:http|https):\/\/\S*(?:\s|$)/g;
var str = "url is http://moonland.tistory.com/ !!\n";
str += "blah home: http://moonland.tistory.co.kr";
newstr = str.replace(re, function (str,p1,offset,s) {
return "<a href='" + str + "'>" + str + "</a>";
}
).replace(/\n/, "<br>");
document.write(newstr);
1.
실행 결과: abcdffe
e가 2번 있지만, 첫번째 인자가 정규식이 아니라 문자열일 경우는 첫번째 것만 바꾼다.
2.
실행 결과: cba
3.
실행 결과: Smith, John
re에 의해서 찾아진 문자열 들은 re에서 ()로 표현된 순서대로 $1, $2와 같이 변수로 저장된다.
4.
url is http://moonland.tistory.com/ !!
blah home: http://moonland.tistory.co.kr
str: 찾은 문자열
p1: ()에서 검색된 1번째 문자열. 마찬가지로 p2,p3 등도 가능
offset: str을 찾은 위치
s : 원본 문자열.
Array String.match(regular expression var str = "ABCdEFgHiJKL";
var myResult = str.match(/[a-z]/g );
for(var cnt = 0 ; cnt < myResult.length; cnt++){
document.write(cnt +":" + myResult[cnt] +"<br>");
}
document.write("비교<br>");
var str = "ABCdEFgHiJKL";
var myResult = /[a-z]/g.exec(str);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
document.write(cnt +":" + myResult[cnt] +"<br>");
}실행 결과:
0:d
1:g
2:i
비교
0:d
String.match(RegExp) =>g flag가 있어도 다 찾아낸다.
RegExp.exec(String) =>g flag가 있으면, 한 개만 찾고 끝낸다.Array String.split([separator[, limit]]) var str = "ABCdEFgHiJKL";
var myResult = str.split(/[a-z]/g , 3);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
document.write(cnt +":" + myResult[cnt] +"<br>");
}실행 결과:
0:ABC
1:EF
2:H
주어진 문자열을 separator를 기준으로 limit 만큼 자른다.
6. 정규식으로 만든 유용한 Javascript 함수
String removeTags(input)
HTML tag부분을 없애준다function removeTags(input) {
return input.replace(/<[^>]+>/g, "");
};example>
var str = "<b>blah</b> <i>soft</i>";result>
document.write(str +"<br>");
document.write(removeTags(str));
blah soft
blah softString String.trim()
문자열의 앞뒤 공백을 없애준다.String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};example>
var str = " untrimed string ";result>
document.write("========" + str+ "==============<br>");
document.write("========" + str.trim() + "==============");
======== untrimed string ==============
========untrimed string==============String String.capitalize()
단어의 첫 글자를 대문자로 바꿔준다.String.prototype.capitalize = function() {
return this.replace(/\b([a-z])/g, function($1){
return $1.toUpperCase();
}) ;
};example>
var str = "korea first world best";result>
document.write(str.capitalize());
Korea First World BestString number_format(input)
입력된 숫자를 ,를 찍은 형태로 돌려준다function number_format(input){
var input = String(input);
var reg = /(\-?\d+)(\d{3})($|\.\d+)/;
if(reg.test(input)){
return input.replace(reg, function(str, p1,p2,p3){
return number_format(p1) + "," + p2 + "" + p3;
}
);
}else{
return input;
}
}example>
document.write(number_format(1234562.12) + "<br>");result>
document.write(number_format("-9876543.21987")+ "<br>");
document.write(number_format("-123456789.12")+ "<br>");
1,234,562.12
-9,876,543.21987
-123,456,789.12
7. Java 정규식 함수
Pattern p = Pattern.compile("(a*)(b)");
Matcher m = p.matcher("aaaaab");
if (m.matches()) {
for (int i = 0; i < m.groupCount() + 1; i++) {
System.out.println(i + ":" + m.group(i));
}
} else {
System.out.println("not match!");
}
result> 0:aaaaab 1:aaaaa 2:b 0번째는 매칭된 부분.
String a = "I love her";
System.out.println(a.replaceAll("([A-Z])", "\"$1\""));
result> "I" love her 자바도 $1을 쓸 수 있다.
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) { m.appendReplacement(sb, "dog");
System.out.println(sb.toString());
}
m.appendTail(sb);
System.out.println(sb.toString());
result> one dog one dog two dog one dog two dogs in the yard
'Programming > JAVASCRIPT' 카테고리의 다른 글
유용한 자바 스크립트 함수. (0) 2010.08.13 접근성을 해치지 않는 자바스크립트. (0) 2010.05.14 prototype.js 알고 사용하자. (0) 2010.05.06 개발시 자주 사용하는 스크립트 모음. (0) 2010.05.03 쉽게 배우는 정규식 사용법. (0) 2010.05.03