반응형
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가 있으며, 뒤에 숫자가 없음. 쉼표 찍음.
다음숫자도 같은방식.
정규식이 이런 순차적으로 탐색하는건지는 모르겠지만, 패턴 적용은 위 과정과 같음.
반응형
'C,C++' 카테고리의 다른 글
[C++] std::list 에서 std::advance / 백준 1406번 에디터 (0) | 2019.12.21 |
---|---|
[C++] 익명 네임스페이스, anonymous(unnamed) namespace (0) | 2019.12.08 |
백준 1620번 풀면서 c++ map (0) | 2019.10.19 |
[C/C++] 비주얼스튜디오 2015 평가판 연장 방법 , 평생 무료 (0) | 2017.03.03 |
[C/C++] WinINet vs WinHTTP in MSDN (0) | 2017.02.23 |
댓글