본문 바로가기

공부

[우아한테크코스 7기] 프리코스 1주차 (java)

728x90

알게된 점

 

정규 표현식 사용하여 특정 문자 추출하기

Pattern, Matcher

Pattern : 정규 표현식에 대한 대상 문자열을 검증하거나 활용하기 위해 사용되는 클래스

Matcher : 대상 문자열과 패턴이 일치하는 부분을 찾는데 사용되는 클래스

 

예시

String input = "//'\n1;2;3";

// "//" "\n" 사이 단어 추출
Pattern pattern = Pattern.compile("//(.*?)(?=\\\\n)");
Matcher matcher = pattern.matcher(input);

// 조건에 해당하는 단어가 있을 경우, 추출하여 저장하고, 기존 문자열에서 제거한다.
if(matcher.find()) {
        String customSep = matcher.group(1); // ';'
        sep.add(escapeRegexSpecialChars(customSep)); // ';' 저장
        this.input = input.replace(matcher.group(0), "").replace("\\n", "").trim(); // input = "1;2;3"
}
  • Pattern 클래스를 선언한다. 클래스 내의 compile 메소드를 사용하여 주어진 정규 표현식으로부터 패턴을 만든다.
  • 여기서는 '//'부터  '\n'(문자열을 의미함. 개행문자가 아님) 까지의 문자열이 존재하는지를 확인한다.
    • (.*?) : '.'는 모든 문자를, *는 없거나 여러개 있거나, ?는 없거나 하나 있거나 를 의미한다. 따라서 null, 공백을 포함한 그 어떤 문자든 모두 포함한다.
    • (?=\\\\n) : 문자열 '\n'이 있는지 확인하는 조건식이다.
      '\n' 만 쓰면 개행문자로 인식되어 문자열 '\n'은 인식하지 못한다. 따라서 이스케이프 문자를 활용해야한다.
      '\\' 처럼 \를 두 번 쓰면 '\'를 의미한다. 따라서 \\\\는 '\\'를 의미하고, \\는 '\'이므로, \\\\n == '\n'을 뜻한다.
  • matcher.find() : 패턴에 해당하는 부분이 input에 존재하는지 찾고 있으면 true를 반환한다.
  • matcher.group(1) : 패턴에 해당하는 단어. 여기서는 (.*?)에 해당하는 부분을 의미한다. 
  • matcher.group(0) == matcher.group() : 패턴 전체를 의미한다. 여기서는 "//;" 이다. ('\n'은 개행문자라 그런지 인식하지 못해서 후에 따로 제거했다.)

 

배열을 문자열로, 문자열을 배열로.

join()

배열을 문자열로 합친다. 이때 사이사이 원하는 문자를 넣어 합칠 수도 있다.

 

예시

String[] sep = {".", ";", ":"};

String regex = String.join("|", sep); // regex = ".|;|:"

sep 배열 원소 사이사이에 "|" 를 넣어 하나의 문자열로 만든다.

 

split()

구분자 하나 또는 여러개로 문자열을 분리할 수 있다.

 

예시

String input = "1;2:3";

String[] numArr = input.split(regex); // == input.split(",|;|:");
// numArr = ["1", "2", "3"]
  • split() 안에 넣은 문자를 기준으로 분리하여 배열을 만들 수 있다.
  • '|'와 같은 기호를 써서 정규 표현식을 활용하여 구분자를 여러개 입력할 수도 있다.
    • input.split(",|;|:")는 ',' 또는 ';' 또는 ':'를 구분자로 하여 문자열을 분리해달라는 의미이다.

 

반응형