C++ string 클래스
표준 라이브러리에서 제공하는 문자열 클래스
로우 문자열 리터럴 : \t \n같은 이스케이프 시퀀스를 일반 문자열로 취급한다.
string str = R"(Line1
line "2" \t (and)
end)";
로컬라이제이션
1. 문자열 리터럴의 로칼라이제이션
cout << "Read" << n "bytes" << endl;
은 어순등의 이유로 다국어 지원에 문제가 생긴다.
cout << Format(IDS_TRANSFERRED, n) << endl;
처럼 리소스 테이블에 등록된 문자열 이름을 활용한다.
2. 와이드 문자
어떤 언어들은 문자 집합을 표현하는데 8비트로 부족하다.
C++는 한 바이트보다 큰 와이드 문자를 표현하기 위해 wchar_t라는 내장 타입을 지원한다.
wchar_t를 이용하라면 문자 리터럴 앞에 L을 붙여야한다.
wchar_t wstr = L'm';
wchar_t의 크기는 표준에서 정의되어 있지 않기 때문에 sizeof(wchar_t)의 크기를 특정 값으로 가정하면 안된다.
3. 비영어권 문자 집합
유니버셜 문자 집합은 문자 표준을 다루는 ISO 10646과 유니코드에 의해 정의된다.
UTF-8 : 8비트 문자를 보존하면서 유니코드 문자를 표현할 수 있는 인코딩
UTF-16 : 유니코드 문자를 16비트 값 하나 또는 둘을 이용하는 인코딩
UTF-32 : 모든 유니코드 문자를 32비트에 딱 맞추어 인코딩
C++11에서는 새로운 문자 타입 char16_t와 char32_t를 도입했다.
char : 8비트. ASCII, UTF-8로 인코딩된 유니코드 문자를 저장하는 기본 타입으로 사용가능하며, 유니코드 문자 하나는 4개의 char를 사용.
char16_t : 16비트. UTF-16으로 인코딩된 유니코드 문자를 저장하는 기본 타입으로 사용 가능하며, 문자 하나는 1개 또는 2개의 char16_t를 사용.
char32_t : 32비트. UTF-32로 인코딩된 유니코드 문자를 저장하는 기본 타입으로 사용 가능하며, 유니코드 문자 하나는 1개의 char32_t를 사용.
표준에서는 다음과 같은 매크로도 추가로 정의한다.
__STDC_UTF_32__ : char32_t 타입은 UTF-32 인코딩을 사용한다.
__STDC_UTF_16__ : char16_t 타입은 UTF-16 인코딩을 사용한다.
C++11에서는 문자열 리터럴 앞 첨자 L처럼 추가로 세가지를 정의 한다.
u8 : UTF-8 인코딩을 사용하는 char 타입 문자 한 개의 리터럴
u : __STDC_UTF_16__이 선언되어 있으면 UTF-16을 사용하는char16_t 타입 문자 한 개의 리터럴
U : __STDC_UTF_32__이 선언되어 있으면 UTF-32를 사용하는 char32_t 타입 문자 한개의 리터럴
L : 컴파일러 종속적인 인코딩을 사용하는 wchat_t 타입 문자 한 개의 리터럴
const char* s1 = u8R"(Raw UTF-8 endcoded string literal)";
const wchar_t* s2 = LR"(Raw wide string literal)";
const char16_t* s3 = uR"(Raw char16_t string literal)";
const char32_t s4 = UR"(Raw char32_t string literal)";
4. 로케일과 패싯
로케일 : 문화적 차이에 따른 데이터를 모아 놓고 관리하는 메커니즘
패싯 : 로케일의 구성 요소로 날짜나 시간 포맷 같은 것
wcout.imbue(locale("C"));
wcout << 32767 << endl; ====> 32767
wcout.imbue(local("en_us"));
wcout << 32767 << endl; =====> 32,767
특정 로케일의 특정 패킷 정보를 얻을 때는 std::use_facet() 메서드를 이용한다.
use_facet()은 파라미터로 locale을 받는다.
ex)
locale locUSEng("en_US");
locale locBritEng("en_GB");
wstring dollars = use_facet<moneypunct<wchar_t>>(locUSEng).curr_symbol();
wstring pounds = use_facet<moneypunct<wchar_t>>(locBritEng).curr_symbol();
wcout << L"In the US, the currency symbol is" << dollars << endl;
wcout << L"In Great Britain, the currency sybbol is" << pounds << endl;
5. 정규표현식
C++11에서 새로게 추가된 기능으로 다음과 같은 역할을 한다.
포맷 검증 : 문자열이 특정 포맷을 따르고 있는지 검증
판정 : 입력된 문자열이 어떤 종류의 표현인지 판단
파싱 : 입력된 문자열로부터 정보를 추출
변환 : 특정 문자열 조각을 찾아서 새로운 문자열 조각으로 치환
순회 : 특정 문자열 조각이 등장하는 모든 위치를 찾음
토근분리 : 특정 구분자를 기반으로 문자열을 분리
5.1 ECMAScript문법
앵커 : 특수문자 '^'(문자열의 시작)와 '$'(문자열의 끝)
와일드카드 : '.'는 한 개의 문자와 대응된다. a.c / a5c(O), ab5c(X)
반복문자 :
'*' : 직전 패턴이 0개 또는 하나 이상 반복되는 것에 매칭된다. a*b / b, ab, aab, aaaa(O)
'+' : 직전 패턴이 하나 이상 반복되는 것에 매칭된다. a+b / ab, aab, aaaab(O), b(X)
'?' : 직전 패턴이 0개 또는 한 번 나오는 것에 매칭된다. a?b / b, ab(O)
{...} : 직전 패턴의 반복 회수를 직접 지정하여 매칭한다.
선택형 매칭 : '|'는 또는 관계를 설정한다. a|b / a(O), b(O)
캡쳐 그룹 : '(' ')'는 서브 표현식을 표시하는데 이용된다. (.*)(ab|cd)(.*) / 123cd4 => 123cd4 => 123, cd, 4
문자 집합 매칭 : '[' ']' 사이에 특정 문자 범위를 지정한다. [abc] / a 또는 b 또는 c에 매칭.
범위 지정 : [a-zA-Z]
문자 계열 : [:name:]
alnum : 대소문자 알파벳, 아라비아 숫자
alpha : 대소문자 알파벳
blank : 스페이스, 탭등 공백 문자
cntrl : 줄 바꿈, 탭과 같은 포매팅 관련 특수 문자
digit : 아라비아 숫자
graph : 대소문자 알파벳, 아라비아 숫자, 구두점 문자
lower : 소문자 알파벳
print : 대소문자 알파벳, 아라비아 숫자, 구두점 문자, 공백 문자
punct : 구두점 문자
space : 공백 문자
upper : 대문자 알파벳
xdigit : 아라비아 숫자와 16진수 문자 a, b, c, d, e, f, A, B, C, D, E, F
d : digit과 동일
s : space와 동일
w : alnum과 동일
^(\d+)-.*-\1$
문자열의 시작 ^
위에 연이어, 하나 이상의 연속적인 숫자로 된 캡쳐그룹(\d+)
위에 연이어, 하이픈 하나 -
위에 연이어, 0개 또는 하나 이상의 문자 .*
위에 연이어, 앞에서 매칭한 첫 번쨰 캡처 그룹과 완전히 같은 문자열 \1
위에 연이어, 문자열의 끝 $
5.2 regex 라이브러리
basic_regex : 특정 정규표현식을 나타내는 객체
match_results : 정규 표현식에 매칭되는 문자열 부분들로 모든 캡처 그룹을 담고 있다.
sub_match : 매칭된 특정 그룹 캡처 그룹을 나타내는 반복자 쌍이다.
regex_match() : 원본 문자열과 정규 표현식의 패턴을 비교하여 전체 원본 문자열에 대해 매칭되면 true
regex_search() : 원본 문자열의 일부분이 매칭되는 경우 true
regex_replace() : 원본 문자열과 매칭된 서브 문자열을 교체한다
'프로그래밍 > C,C++' 카테고리의 다른 글
STL 커스터마이징 (0) | 2018.04.18 |
---|---|
유틸리티 라이브러리 (0) | 2018.04.18 |
함수 객체 (0) | 2018.04.15 |
람다(lambda) (0) | 2018.04.11 |
STL 알고리즘 (0) | 2018.04.02 |