정규 표현식이라는 표현식을 이용하여 패턴이 매칭하는지 검사 할 수 있다. 예를들어 어떤 문자열이 A부터 C사이에 글자로 시작하면서 5글자이내의 글자인지를 검사하거나 해당 문자열이 숫자로만 이루어지고 10글자 이내의 글자인자를 검사할 수 있다. 정규표현식을 잘 작성하면 해당 문자열이 전화번호형식인지 이메일 형식인지 등을 쉽게 검사할 수 있다. 구글링을 통해 해당 정규표현식은 쉽게 찾을 수 있다.

 정규 표현식을 사용하여 패턴 매칭을 하는 것이 속도도 빠르고 정확하다. 사용자가 코드를 아무리 잘짜더라도 정규표현식을 이용하여 패턴 매칭을 하는 것보다 빠르기는 힘들다.

아래 링크는 정규 표현식을 정리한 위키백과이다. 참고하도록 하자.

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D


 프로그래머들이 많이 사용하고 유용하기 때문에 많은 언어에서는 쉽게 정규표현식을 사용하여 패턴매칭을 할 수 있도록 언어차원에서 라이브러리를 지원해준다.

 JAVA 에서도 정규식을 사용하여 패턴 매칭을 할 수 있다.



간단히 핵심을 정리하자면 아래와 같다. 정말 중요하고 기본적인 내용만을 정리했다. 좀더 자세한 내용은 위에서 소개한 위키를 참고하도록 하면 된다.

. : 하나의 문자를 의미한다.
예제 : A.B 패턴은 AAB(일치), A1B(일치), AAB(불일치), AB(불일치) 이다.

? : 아무문자도 없거나 하나의 문자 있는 것을 의미한다.

예제 : A?B 패턴은 AAB(일치), AB(일치), AAA(불일치), AAAB(불일치) 이다.


* : 0개나 하나이상의 문자가 있는 것을 의미한다.

예제 : A*B 패턴은 AB(일치), AAAAAAAAAAAB(일치), A123B(일치), AAAAAAAAAAAA(불일치) 이다.


+ : +앞에있는 문자가 한번이상 반복됨을 의미한다.

예제 : AB+ 패턴은 AB(일치), ABBBB(일치), A(불일치), ABC(불일치) 이다.


[] : [ ] 사이에 있는 형식이 일치하는것을 의미한다. 즉 [AB] 는 A, B만일치, [A-Z] 는 A부터 Z중 하나의 문자와 일치한다.

예제 : [A-C] 패턴은 A(일치), B(일치), AB(불일치), BC(불일치) 이다.


() : ( ) 사이에 문자가 하나의 묶음이된다. 즉 (ab)+ 는 abababab 와 일치한다.

예제 : (ab) 패턴은 ab(일치), ba(불일치) 이다.


{} : { } 사이에 숫자를 쓰면 그 숫자만큼 패턴이 반복됨을 의미한다.

[A-C]{1,3}는 A,B,C 를 1개에서 3개 조합하면 된다. AAA도 가능하고 A, BA, ABC, CBA도 가능하다.

예제 : [A-C]{1,3} 패턴은 AA(일치), CBC(일치), ADA(불일치), ACCC(불일치) 이다.


[^] : ^다음에 문자를 쓰면  해당 문자를 제외한다는 의미한다.

예제 : [^A-C]D 패턴은 DD(일치), AD(불일치), D(불일치), DDD(불일치) 이다.


JAVA에서 정규표현실을 사용하여 패턴매칭을 하는 예시는 아래와 같다.

2가지의 import도 반드시 시켜줘야 한다. Pattern 클래스는 패턴을 저장하고 Matcher라는 클래스는 검사결과를 저장한다. 그래서 Matcher에 함수인 matches 함수를 사용하여 결과를 boolean 으로 리턴받을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexTestStrings {
    public static void main(String[] args) {        
         Pattern pattern = Pattern.compile("패턴 입력");  
         Matcher match = pattern.matcher("검사할 문자열"); 
         boolean bool = match.matches();
         if(bool)
             System.out.println("일치");
         else
             System.out.println("불일치");
     }
}
cs


아래는 실제 사용 예제이다.

A부터C사이의 글자로 시작을하고 그다음 글자가 D인 패턴과 일치하는지 검사한다.

AD는 해당 패턴과 일치한다. 따라서 일치가 출력된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexTestStrings {
    public static void main(String[] args) {        
        Pattern pattern = Pattern.compile("[^A-C]D"); 
        Matcher match = pattern.matcher("AD"); 
        boolean bool = match.matches();
        if(bool)
            System.out.println("일치");
        else
            System.out.println("불일치");
    }
}
cs


아래링크는 C#에서의 정규식을 사용한 패턴매칭에 관한 포스팅이다. 참고하도록 하자.

C#에서 정규식을 사용하여 패턴 매칭(Regex, IsMatch) : http://hijuworld.tistory.com/22


Posted by 꿈만은공돌
,

String 클래스의 경우 sealed 선언이 되어 있어 상속이 불가능하다.


selaed 키워드에 대해선 아래 링크 참고하자.


- C# 상속금지 키워드 sealed 키워드 : http://hijuworld.tistory.com/44


그래서 String 클래스를 상속받아 새로운 메서드를 추가하여 사용하고 싶어도 불가능하다.

아래 처럼 에러가 발생한다.




하지만 C# 3.0에서 확장 메서드 기능을 사용하면 String에 메서드를 추가한 것 같이 사용이 가능하다.


아래 코드를 보자.


1
2
3
4
5
6
7
8
9
10
using System.Text.RegularExpressions;
 
static class PlusString
{
    public static bool IsValidPhone(this string input)
    {
        Regex regex = new Regex(@"^01[01678]-[0-9]{4}-[0-9]{4}$");
        return regex.IsMatch(input);
    }
}
cs




static으로 선언한 class에 static 변수를 선언하였다. 매개변수를 this string 을 받도록 하였다.

this는 컴파일러에게 이 메서드가 string타입을 확장한 메서드라는 것을 알려주는 역활을 한다. 


그리고 메서드의 내용은 정규표현식을 사용하여 input이 전화번호인지 검사하는 코드이다.
정규표현식을 검사하는 Regex class 에 대해서는 아래 링크를 참고하자.

- C# 정규식을 사용하여 패턴 매칭(Regex, IsMatch) : http://hijuworld.tistory.com/22



이제 해당 확장메서드를 사용해보자.


아래코드는 그 예시이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program
{        
    static void Main(string[] args)
    {
        String test = "010-9559-4444";
        if (test.IsValidPhone())
            Console.WriteLine("일치");
        else
            Console.WriteLine("불일치");
 
        test = "012-9559-4444";
        if (test.IsValidPhone())
            Console.WriteLine("일치");
        else
            Console.WriteLine("불일치");
    }
}
cs


실제로 String 클래스의 메서드처럼 사용하면 된다.



참고자료 : 크로스 플랫폼 개발을 위한 C# 7과 닷넷 코어 2.0 ( 에어콘 출판사) 7장



Posted by 꿈만은공돌
,

정규표현식이라는 표현식을 이용하여 패턴이 일치 하는지 검사 할 수 있다. 예를들어 어떤 문자열이 A부터 C사이에 글자로 시작하면서 5글자이내의 글자인지를 검사하거나 해당 문자열이 숫자로만 이루어지고 10글자 이내의 글자인자를 검사할 수 있다. 정규표현식을 잘 작성하면 해당 문자열이 전화번호형식인지 이메일 형식인지 등을 쉽게 검사할 수 있다. 구글링을 통해 해당 정규표현식은 쉽게 찾을 수 있다.

 정규 표현식을 사용하여 패턴 매칭을 하는 것이 속도가 빠르고 정확하다. 사용자가 코드를 잘작성 하더라도 정규표현식을 이용하여 패턴 매칭을 하는 것보다 빠르기는 힘들다.




정규 표현식을 정리한 위키백과이다. 자세한내용은 아래 링크를 참고하도록 하자.

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D


간단히 정리하자면 아래와 같다. 아래의 표현들만 알아도 어느정도 사용하는데 문제가 없다. 더 필요한 것이 있다면 위키를 참고하자.


. : 하나의 문자를 의미한다.
예제 : A.B 패턴은 AAB(일치), A1B(일치), AB(불일치), AAB(불일치) 이다.

? : 아무문자도 없거나 하나의 문자가 있는 것을 의미한다.

예제 : A?B 패턴은 AAB(일치), AB(일치), AAA(불일치), AAAB(불일치) 이다.


* : 0개나 하나이상의 문자가 있는 것을 의미한다.

예제 : A*B 패턴은 AB(일치), AAAAAAAAAB(일치), A123B(일치), AAAAAAAA(불일치) 이다.


+ : +앞에있는 문자가 한번이상 반복됨을 의미한다.

예제 : AB+ 패턴은 AB(일치), ABBBB(일치), ABC(불일치), A(불일치) 이다.


[] : [ ] 사이에 있는 형식이 일치하는것을 의미한다. 즉 [AB] 는 A, B만일치, [A-Z] 는 A부터 Z중 하나의 문자와 일치한다.

예제 : [A-C] 패턴은 A(일치), B(일치), AB(불일치), BC(불일치) 이다.


[^] : ^다음에 문자를 쓰면 해당 문자를 제외한다는 것을 의미한다.

예제 : [^A-C]D 패턴은 DD(일치), AD(불일치), DDD(불일치), D(불일치) 이다.


() : ( ) 사이에 문자가 하나의 묶음이된다. 즉 (ab)+ 는 abababab 와 일치한다.

예제 : (ab) 패턴은 ab(일치), ba(불일치) 이다.


{} : { } 사이에 숫자를 쓰면 그 숫자 만큼 패턴이 반복됨을 의미한다.

[A-C]{1,4}는 A,B,C 를 1개에서 4개 조합하면 된다. AAAA도 가능하고 A, BA, ABC, ACBA도 가능하다.

예제 : [A-C]{1,3} 패턴은 AA(일치), CBC(일치), ADA(불일치), ACCC(불일치)이다.


^ : 문자열의 시작을 의미한다.


@ : 문자열의 끝을 의미한다.




C#에서도 정규식을 사용하여 패턴 매칭을 할 수 있다. C#에서 제공해주는 정규식 관련 라이브러리는 사용하기 간단하다. 따로 라이브러리를 추가할 필요가 없기때문에 적극 활용하도록 하자.


정규 표현식 앞에 @를 쓰는거는 이스케이프(escape) 문자 기능을 동작하지 않게한다. 꼭 써주는 것이 좋다.


정규표현식을 위해선 Regex 클래스를 사용한다. 해당 클래스에 정규식표현을 가지고 객체를 만들면 된다. 그리고 Regex의 IsMatch 함수를 써서 패턴매칭을 한다. IsMatch 함수는 해당 패턴과 매칭하여 결과를 Bool 형식으로 반환한다. 일치하면 true, 일치하지 않으면 false를 반환한다.


아래는 사용 예제이다. 첫번째는 휴대폰 번호를 검사하는 것이고 두번째는 한글 이름 3글자를 검사하는 패턴 매칭이다. 

휴대전화 예제는 01 로 시작을 하고 그다음에 0,1,6,7,8 이 세번째 자리에 오고 그다음에 - 문자오고 0부터 9까지의 숫자로 4개의 조합을 만들고 다시 -가 오고 그다음에 0부터 9까지의 숫자로 4글자를 만든다.

3글자 이름을 검사하는 것은 가부터 힣까지의 글자(한글 전체)를 가지고 3가지 조합을 만들면 된다.


추가로 소문자는 a-z 라고하면 되고 대문자는 A-Z로 표현하면 된다.



네임스페이스 using System.Text.RegularExpressions; 을 추가해주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String phoneNumber = "010-1234-5555"//"010-a234-b123"는 miss match
Regex regex = new Regex(@"^01[01678]-[0-9]{4}-[0-9]{4}$");
if (regex.IsMatch(phoneNumber))    
{
    Console.WriteLine("Match");
else 
{
    Console.WriteLine("Miss Match");
}
 
String name = "김공돌";        //"김공1"는 miss match
regex = new Regex(@"^[가-힣]{3}$");    //한글 3글자
if (regex.IsMatch(name))
{
    Console.WriteLine("Match");
}
else
{
    Console.WriteLine("Miss Match");
}





JAVA에서 정규식을 사용하여 패턴 매칭에 관한 포스팅이다. 참고하도록 하자. http://hijuworld.tistory.com/58
Posted by 꿈만은공돌
,