C,C++
c++ 정규식으로 숫자에 콤마찍기
슈퍼닷
2019. 10. 27. 18:18
반응형
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가 있으며, 뒤에 숫자가 없음. 쉼표 찍음.
다음숫자도 같은방식.
정규식이 이런 순차적으로 탐색하는건지는 모르겠지만, 패턴 적용은 위 과정과 같음.
반응형