wiki:IXJavaStudy/13th

P.I.JA 13회

  • (2차) 2012년 5월 10일 목요일 오후 8시 ~ 10시
  • (1차) 2010년 4월 26일 월요일 오후 1시 ~ 2시 반

내용

정규표현식

  • 문자열이 특정한 규칙에 맞는지 확인하고, 원하는 내용을 추출하거나 바꾸기 위해 사용함
  • 여러 종류의 기호들을 조합하여 규칙을 나타냄
  • DOS 시절에도 비슷한 것이 있었음: Wildcard
    • *: 임의의 글자 여러 개와 일치함
    • ?: 임의의 글자 한 개와 일치함
    • *.* 로 지정할 경우 (확장자가 있는) 모든 파일에 대응됨
  • Word의 패턴 검색, 한글의 아무개 문자 검색
  • 정규 표현식 테스트 도구: http://regexr.com/
  • 식에 사용되는 Symbol들
    • \: Escape 문자라고 하며, 뒤에 나올 문자가 특수한 의미를 갖도록 (또는 갖지 않도록) 해 줌
    • \w: 단어를 구성할 수 있는 (→ 공백, 쉼표 등 제외) 문자 한 개
    • \d: 숫자 한 개
    • Escape 뒤에 대문자가 나올 경우 소문자일 때의 반대 기능을 함
      • \W: 단어를 구성하지 않는 문자 한 개
      • \D: 숫자가 아닌 문자 한 개
    • \s: 공백 문자 (↔ \S: 공백이 아닌 문자)
    • [abc]: 대괄호 안에 들어있는 문자 중 아무거나. [a-z]와 같이 범위로 지정할 수도 있음
      • 응용: [A-Z], [A-Za-z], [0-9]
      • [^abc]: a, b, c가 아닌 문자. ^ 문자를 이용해서 반대의 의미를 가지게 함.
      • 한글 사용: [가-힣]과 같이 하면 한글 전체 범위를 포함함
    • .: 임의의 글자 한 개
      • a.: a로 시작해서 임의의 문자가 있는 두 글자
      • a aa aaa aaaa aaaaa abc로 테스트
    • +: 앞에 나온 것이 (1번 이상) 계속 반복됨
      • a+: a가 1개, 2개, ... 계속 반복되는 경우
    • *: 앞에 나온 것이 없거나, 계속 반복됨
      • a*: a가 없거나 1개 이상 반복
      • 비교: aa+aa* - a aa aaa를 대상으로
    • (): 괄호 안의 내용을 나중에 확인할 수 있음
      • 괄호 순서에 따라 $1, $2 등의 변수를 사용하여 그 값을 가져올 수 있다 (Java의 경우 아래 예제에서 보임)
    • (abc|def): 'abc' 이거나 'def' 인 경우
    • ^.+$: 줄의 시작과 끝
      • ^는 (범위에 사용하지 않았을 때는) 줄의 시작, $는 줄의 끝을 의미함
      • 앞의 식은 '줄 전체'를 의미함
    • 요약된 표: https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
  • 해 보기 1: 영문 뉴스 기사에서 'the' 찾아보기
    • the[Tt]he\bthe\b
  • 해 보기 2: 모든 단어 찾기
    • \w+
  • 해 보기 3: a로 시작하는 단어 모두 찾기
    • a\w+\ba\w+\ba\w*
  • 시각적으로 보여주는 Tool을 이용해서, 시행착오를 거치며 정규표현식을 구성해 봄
  • 정규식 문법: POSIX 정규식, Perl 정규식 - Symbol 지원 범위에 차이가 있음
  • 응용
    • 데이터를 원하는 형식으로 변형: 메일로 오가는 발제 분담 명단을 표로 변형하기
    • 대량 데이터에서 필요한 내용을 추출: Twitter에서 Foursquare Check-in 장소 추출하기
    • 웹 주소, 메일 주소 뽑아내기
  • Java에서 사용 예
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegExTest {
        public static void main(String[] args) {
            findTest();
            replaceTest1();
            replaceTest2();
        }
    
        private static void findTest() {
            String sample = "This is 02-345-6789."; // 대상 문자열
    
            Pattern p = Pattern.compile("(\\d+)"); // 찾을 정규식 패턴. Java 자체에서 '\'가 특별한 의미로 사용되기 때문에 \를 두 번 써 주어야 한다  
            Matcher m = p.matcher(sample);
    
            while (m.find())
                System.out.println("찾음: " + m.group());
        }
    
        private static void replaceTest1() {
            String sample = "My phone number is 012-345-6789.";
    
            Pattern p = Pattern.compile("\\d");
            Matcher m = p.matcher(sample);
    
            System.out.println(m.replaceAll("X")); // 일치하는 항목에 대해 모두 바꾸기를 수행. 숫자가 감춰진다
        }
    
        private static void replaceTest2() {
            String sample = "A가 B를 좋아합니다.";
    
            Pattern p = Pattern.compile("(.)가 (.)를"); // 'A'와 'B' 두 Group이 잡힘
            Matcher m = p.matcher(sample);
    
            System.out.println(m.replaceFirst("$2가 $1를")); // 순서가 뒤바뀐다
        }
    }
    
  • 워드프로세서에서 한글을 한자로 변환할 수 있지만, 한자를 한글로 변환할 수도 있음
    • '樂樂樂樂'의 비밀 - 우리 중에 스파이가 있어;; : 한글로 바꿔 보기

Add comment

Last modified 21 months ago Last modified on Aug 4, 2016, 10:27:53 AM