C#

문자열이 몇 번 등장하는지 중복으로 체크하는 법(Regex)

박도치 2025. 6. 18. 22:52

문자열이 몇 번 등장하는지 중복으로 체크하는 방법중 Regex의 Match와 Lookahead 방식의 (?=)을 사용하여 중복을 체크할 수 있다.

 

결론적으로 코드를 보자면 아래와 같다.

 

    public int solution(string myString, string pat)
    {
        string pattern = $"(?={Regex.Escape(pat)})";

        int answer = Regex.Matches(myString, pattern).Count;

        return answer;
    }

 

1.Regex

이는 정규표현식으로 문자열에서 특정 패턴을 체크하거나 치환하는 등에 사용되는 일종의 검색도구이다.

 

이메일 형식검사, 전화번호 찾기, 숫자만 찾기 등등이 있다.

 

  • 이메일 형식 검사: \w+@\w+\.\w+
  • 전화번호 찾기: \d{3}-\d{3,4}-\d{4}
  • 숫자만 찾기: \d+

 

(1) Regex.Escape(string)

 

이는 글자 그대로의 형식을 가져오는 방식으로, 특수문자 까지 그대로 처리하게끔 해주는 코드이다.

 

예를들어 Regex.Escape(string) 의 string 값이 a..a라고 하면 아래처럼 출력된다.

"a\\.\\.a"

 

물론 단순한 문제의 경우 Escape는 필요없고, 특수문자의 경우 같은 특별한 경우에만 사용된다.

 

(2)Regex.Matches(string input, string pattern)

이는 문자열 안에서의 여러가지 패턴을 찾아주는 역할을 한다. 반환값은 MatchCollection으로 .Count를 통해 몇 개를 찾았는지 알 수 있다.

 

 

다만 이런 경우에는 "aaaa"가 문자열이고 "aa"가 찾고싶은 문자라고 가정하면 aa aa이렇게 두 개를 찾기 때문에 중복되는 0~1, 1~2, 2~3 의 인덱스의 aa 총 3개를 구하지 못한다.

 

2. (?=) Lookahead

이는 ?= 의 뒤에값 x를 그 자리에 있는지만 확인하는 식으로 보기만 한다고 생각하면 간단하다.

 

Match의 경우, aa를 찾고, 이를 제외한다음 그다음 aa를 찾기 때문에 중복을 체크할 수 없는 반면, ?=의 경우 aa가 있는지 보고, 그다음 순서를 보는 형식이다.

 

즉 Match는 aa를 체크했으니 1번 인덱스의 a는 더이상 체크할 필요 없기 때문에 2번 인덱스부터 매치하는 형식이고

?=의 경우 aa를 체크해도 중복인지 확인해야하는 관찰 방식이기 때문에 그래도 1번 인덱스를 다시 훑어보는 형식이 된다.

 

이런 방식을 사용하면 중복된 문자열을 해당 두 줄로도 체크할 수 있다.

'C#' 카테고리의 다른 글

[C#] Linq 정리  (0) 2025.04.14
[C#] 프로그래머스 LV2 스킬트리  (1) 2024.12.13
[C#] 백준 1735 분수 합  (0) 2024.11.10
[C#] 백준 11653 소인수분해  (0) 2024.11.03
Graph BFS  (0) 2024.05.15