본문 바로가기
C,C++

c++ 정규식으로 숫자에 콤마찍기

by 슈퍼닷 2019. 10. 27.
반응형

123456789 -> 123,456,789 하는 코드이다.

void removeSpace(std::string& str){
		str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
	}

void appendComma(std::string& expr){
		removeSpace(expr);
		std::regex pattern("\\B(?=(\\d{3})+(?!\\d))"); 
		std::cout << std::regex_replace(expr, pattern, ",") << std::endl;
	}

 

정규식 함수를 사용하기위해 regex 헤더도 참조해야한다.

 

패턴 해석:

\\B : 앞에 경계문자가 있는가?  (여기서는 숫자에 해당)

pattern(?=string) : string앞에 pattern에 일치하는 텍스트가 있는가?

(\\d{3})+ : 숫자가 세개씩 있는데 이런 문자열이 1개 이상 반복된다.

pattern(?!\\d) : pattern에 일치하면서 숫자 앞이 아닌 텍스트가 있는가?

종합하면 앞에는 숫자가 있으며, 뒤에는 뒤에 숫자가 없으며 숫자가 세개씩 있는 문자열 앞의위치를 찾아달라.

 

과정을 살펴보면,

123456789의 경우

1.

1 : 앞에 숫자가 없다. 통과

2.

2 : 앞에 숫자가 있다 -> 패턴에 해당하는 문자열 345678 이 있긴한데, 뒤에 숫자가있어서 안됨.

3.

3: 앞에 숫자가 있다 -> 패턴에 해당하는 문자열 456789가 있으며, 뒤에 숫자가 없음. 쉼표 찍음.

 

다음숫자도 같은방식.

정규식이 이런 순차적으로 탐색하는건지는 모르겠지만, 패턴 적용은 위 과정과 같음.

반응형

댓글