string — 문자열 조작하기
string — 문자열 조작하기
Tcl에서 문자열은 가장 기본이 되는 데이터예요. 그래서 문자열을 비교하고, 자르고, 변환하는 일이 아주 흔하죠. string은 이런 다양한 문자열 연산을 옵션 하나로 선택해 처리하는 명령이에요.
본문
string option arg ?arg ...?
option에 따라 여러 문자열 연산 중 하나를 수행해요. 옵션(축약 가능)들은 다음과 같아요.
-
string cat ?string1? ?string2...?: 주어진 문자열들을 나란히 이어 붙인 것처럼 연결하고 결과를 반환해요. 문자열이 없으면 빈 문자열이 결과예요. 이 기본형은 혼합 인용(mixed quoting)이 필요하거나return -level 0을 쓰지 않고 연결 결과를 반환하려고 할 때 가끔 문자열 나열보다 손쉽고, 빈 조인 문자열로join을 쓰는 것보다 효율적이에요. -
string compare ?-nocase? ?-length length? string1 string2:string1과string2를 문자별로 비교해요.string1이 사전순으로 작으면 -1, 같으면 0, 크면 1을 반환해요.-length를 지정하면 처음length문자만 비교에 사용돼요.-length가 음수면 무시돼요.-nocase를 지정하면 대소문자 구분 없이 비교해요. -
string equal ?-nocase? ?-length length? string1 string2:string1과string2를 문자별로 비교해요. 동일하면 1, 아니면 0을 반환해요.-length를 지정하면 처음length문자만 비교에 사용돼요.-length가 음수면 무시돼요.-nocase를 지정하면 대소문자 구분 없이 비교해요. -
string first needleString haystackString ?startIndex?:haystackString에서needleString의 문자들과 정확히 일치하는 문자 시퀀스를 찾아요. 찾으면 그 첫 번째 일치의 첫 문자의 인덱스를 반환하고, 못 찾으면 -1을 반환해요.startIndex를 지정하면(STRING INDICES에 설명된 어떤 형태든) 검색이 그 인덱스가 가리키는haystackString의 문자부터 시작하도록 제한돼요. 예를 들어string first a 0a23456789abcdef 5는 10을 반환하지만,string first a 0123456789abcdef 11은 -1을 반환해요. -
string index string charIndex:string인자의charIndex번째 문자를 반환해요.charIndex0은 문자열의 첫 문자예요. STRING INDICES 절에 설명된 대로 지정할 수 있어요.charIndex가 0보다 작거나 문자열 길이보다 크거나 같으면 빈 문자열을 반환해요. -
string is class ?-strict? ?-failindex varname? string:string이 지정된 문자 클래스의 유효한 멤버면 1, 아니면 0을 반환해요.-strict를 지정하면 빈 문자열이 0을 반환하고, 아니면 빈 문자열은 어떤 클래스든 1을 반환해요.-failindex를 지정하면 함수가 0을 반환할 때 클래스가 더 이상 유효하지 않은 문자열 내 인덱스가varname변수에 저장돼요.string이 1을 반환하면varname은 설정되지 않아요. 인식되는 문자 클래스(클래스 이름 축약 가능)는 다음과 같아요:alnum: 유니코드 알파벳이나 숫자 문자.alpha: 유니코드 알파벳 문자.ascii: 값이\u0080보다 작은 문자(7비트 ascii 범위).boolean:Tcl_GetBoolean이 허용하는 형태 중 하나.control: 유니코드 제어 문자.digit: 유니코드 숫자 문자 ([0-9] 범위 밖 문자도 포함).double:Tcl_GetDoubleFromObj가 허용하는 형태 중 하나.entier: 선택적 주변 공백을 포함해, Tcl에서 임의 크기 정수 값의 유효한 문자열 형식 중 하나. 수용되는 형식은 C 루틴Tcl_GetBignumFromObj가 받아들이는 것과 정확히 같아요.false:Tcl_GetBoolean이 허용하는 형태 중 값이 false인 것.graph: 공백을 제외한 유니코드 인쇄 문자.integer: 선택적 주변 공백을 포함해, Tcl에서 32비트 정수 값의 유효한 문자열 형식 중 하나. 값이 오버플로되면 0을 반환하고varname에 -1이 들어가요.list: 선택적 주변 공백을 포함한 적절한 리스트 구조. 부적절한 리스트 구조면 0을 반환하고varname에 리스트 파싱이 실패한 '요소'의 인덱스가 들어가요. 결정할 수 없으면 -1이 들어가요.lower: 유니코드 소문자 알파벳 문자.print: 공백을 포함한 유니코드 인쇄 문자.punct: 유니코드 문장 부호 문자.space: 유니코드 공백 문자. 몽골어 모음 분리자(U+180e), 제로 너비 공백(U+200b), 단어 결합자(U+2060), 제로 너비 비분리 공백(U+feff, =BOM) 포함.true:Tcl_GetBoolean이 허용하는 형태 중 값이 true인 것.upper: 유니코드 문자 집합의 대문자 알파벳 문자.wideinteger: 선택적 주변 공백을 포함해, Tcl에서 wide 정수의 유효한 형태 중 하나. 값이 오버플로되면 0을 반환하고varname에 -1이 들어가요.wordchar: 유니코드 단어 문자. 즉 알파벳 숫자 문자와 유니코드 연결 문장 부호 문자(예: 밑줄).xdigit: 16진수 숫자 문자 ([0-9A-Fa-f]).
boolean,true,false의 경우 함수가 0을 반환하면 유효한 boolean 값의 다양한 성질 때문에varname은 항상 0으로 설정돼요. -
string last needleString haystackString ?lastIndex?:haystackString에서needleString의 문자들과 정확히 일치하는 시퀀스를 찾아요. 찾으면 마지막 일치의 첫 문자 인덱스를 반환하고, 없으면 -1을 반환해요.lastIndex를 지정하면(STRING INDICES의 어떤 형태든) 그 인덱스 이하의haystackString문자만 검색에 고려돼요. 예를 들어string last a 0a23456789abcdef 15는 10을 반환하지만,string last a 0a23456789abcdef 9는 1을 반환해요. -
string length string:string의 문자 수를 나타내는 십진 문자열을 반환해요. 문자열 저장에 쓰이는 바이트 수와 반드시 같지는 않다는 점에 주의하세요. 값이 바이트 배열 값(예: 바이너리 인코딩 채널에서 읽은 값)이면 실제 바이트 길이를 반환해요. -
string map ?-nocase? mapping string:mapping의 키-값 쌍에 따라string의 부분 문자열을 교체해요.mapping은array get이 반환하는 형태처럼key value key value ...리스트예요. 문자열에서 각 키의 각 인스턴스는 해당 값으로 교체돼요.-nocase를 지정하면 대소문자 차이를 무시하고 매칭해요. 키와 값 모두 여러 문자일 수 있어요. 교체는 순서대로 이루어져서, 리스트에 먼저 나오는 키가 먼저 검사돼요.string은 한 번만 반복되므로 앞선 키 교체가 나중 키 매칭에 영향을 주지 않아요. 예를 들어string map {abc 1 ab 2 a 3 1 0} 1abcaababcabababc는 문자열 01321221을 반환해요. 앞선 키가 나중 키의 접두사면 나중 키를 완전히 가려요. 그래서 위 예시를string map {1 0 ab 2 a 3 abc 1} 1abcaababcabababc처럼 재배열하면 02c322c222c를 반환해요. -
string match ?-nocase? pattern string:pattern이string과 일치하는지 확인해요. 일치하면 1, 아니면 0을 반환해요.-nocase를 지정하면 대소문자 구분 없이 매칭을 시도해요. 두 문자열이 일치하려면 내용이 동일해야 하는데,pattern에는 다음 특수 시퀀스가 나타날 수 있어요:*:string의 어떤 문자 시퀀스(빈 문자열 포함)와도 일치.?:string의 어떤 단일 문자와도 일치.[chars]:chars가 주는 집합의 어떤 문자와도 일치.chars에x-y형태의 시퀀스가 있으면 x와 y 사이(양 끝 포함)의 어떤 문자와도 일치해요.-nocase와 함께 쓰면 범위의 끝점이 먼저 소문자로 변환돼요.{[A-z]}는 대소문자 구분 매칭에서_와 일치하지만(_가Z와a사이에 있으므로),-nocase에서는{[A-Za-z]}처럼 취급돼요(아마 원래 의도한 것일 거예요).\x: 단일 문자 x와 일치.pattern에서*?[]\문자의 특수 해석을 피하는 방법이에요.
-
string range string first last:string에서 인덱스first의 문자로 시작해last의 문자로 끝나는 연속 문자 범위를 반환해요(STRING INDICES에 설명된 형태 사용). 인덱스 0은 첫 문자,end는 마지막 문자를 가리켜요.first나last는index메서드처럼 지정할 수 있어요.first가 0보다 작으면 0으로,last가 문자열 길이보다 크거나 같으면end로 취급돼요.first가last보다 크면 빈 문자열을 반환해요. -
string repeat string count:string을count번 이어 붙인 문자열을 반환해요.count가 0이면 빈 문자열을 반환해요. -
string replace string first last ?newstring?:string에서 인덱스first로 시작해last로 끝나는 연속 문자 범위를 제거해요(STRING INDICES에 설명된 형태 사용). 인덱스 0은 첫 문자예요.newstring을 지정하면 제거된 자리에 놓여요.first가 0보다 작으면 0으로,last가 문자열 길이보다 크거나 같으면end로 취급돼요.first가last보다 크거나,first가 초기 문자열 길이보다 크거나 같거나,last가 0보다 작으면 초기 문자열이 그대로 반환돼요. -
string reverse string:string과 길이가 같지만 문자가 역순인 문자열을 반환해요. -
string tolower string ?first? ?last?: 모든 대문자(또는 타이틀 케이스) 문자가 소문자로 변환된 것을 제외하고string과 같은 값을 반환해요.first를 지정하면 수정 시작 위치의 첫 문자 인덱스예요.last를 지정하지 않으면first위치의 문자만 변환되고, 지정하면last가 수정을 멈출(포함) 문자 인덱스예요. STRING INDICES에 설명된 형태로 지정할 수 있어요. -
string totitle string ?first? ?last?: 첫 문자가 유니코드 타이틀 케이스 변형(타이틀 케이스 변형이 없으면 대문자)으로 변환되고 나머지는 소문자로 변환된 것을 제외하고string과 같은 값을 반환해요.first는 수정 시작 위치의 첫 문자 인덱스예요.last를 지정하지 않으면first위치의 문자만 변환되고, 지정하면 멈출(포함) 인덱스예요. -
string toupper string ?first? ?last?: 모든 소문자(또는 타이틀 케이스) 문자가 대문자로 변환된 것을 제외하고string과 같은 값을 반환해요. 옵션은tolower와 같아요. -
string trim string ?chars?:chars가 주는 문자열에 있는 앞뒤 문자를 제거한 것을 제외하고string과 같은 값을 반환해요.chars를 지정하지 않으면 공백(문자열에 대해string is space가 1을 반환하는 문자와"\0")을 제거해요. -
string trimleft string ?chars?:chars에 있는 앞쪽(leading) 문자를 제거한 것을 제외하고string과 같은 값을 반환해요.chars를 지정하지 않으면 공백을 제거해요. -
string trimright string ?chars?:chars에 있는 뒤쪽(trailing) 문자를 제거한 것을 제외하고string과 같은 값을 반환해요.chars를 지정하지 않으면 공백을 제거해요.
사용되지 않는(obsolete) 하위 명령
이 하위 명령들은 현재 지원되지만, 기능이 거의 쓰이지 않거나 매우 오해를 부르기 때문에 향후 릴리스에서 사라질 가능성이 있어요.
string bytelength string: Tcl의 내부 수정 UTF-8로 인코딩했을 때 메모리에서string을 나타내는 데 쓰이는 바이트 수를 나타내는 십진 문자열을 반환해요. Tcl은string에 다른 인코딩도 쓸 수 있고 특정 문자열에 단일 인코딩만 쓸 것을 보장하지 않아요. UTF-8은 유니코드 문자를 표현하는 데 가변 바이트 수를 쓰므로, 바이트 길이는 일반적으로 문자 길이와 같지 않아요. 스크립트가 바이트 길이를 신경 써야 하는 경우는 드물어요. 거의 모든 경우에string length를 써야 해요(바이트 배열 값의 길이를 구하는 것 포함). 형식적으로string bytelength는Tcl_GetString을 호출해bytes필드가 채워진 뒤Tcl_Obj구조체의length필드 내용을 반환해요. Tcl의 내부 인코딩은 엄격한 UTF-8이 아니라 수정된 CESU-8(비정규화된 NUL 포함, Java 직렬화 메커니즘이 여러 곳에서 쓰는 것과 동일)이라서 Tcl 스크립트에는 별로 유용하지 않아요. 이 표현은 Tcl 구현만 쓰는 것이므로 저장 바이트 수의 가치는 아주 낮아요(C 확장 코드 제외). 호환성 참고: 이 하위 명령은 향후 Tcl 버전에서 제거될 가능성이 있어요. 문자열을 알려진 인코딩으로 변환한 뒤string length를 적용하는encoding convertto명령을 쓰는 게 낫습니다.string length [encoding convertto utf-8 $theString].string wordend string charIndex:string의charIndex문자를 포함하는 단어에서 마지막 문자 바로 다음 인덱스를 반환해요. 단어는 알파벳 숫자(유니코드 문자 또는 십진 숫자)나 밑줄(유니코드 연결 문장 부호)의 연속 범위, 또는 그 외 단일 문자로 간주돼요.string wordstart string charIndex:string의charIndex문자를 포함하는 단어의 첫 문자 인덱스를 반환해요. 단어 정의는wordend와 같아요.
문자열 인덱스(STRING INDICES)
문자열의 인덱스를 가리킬 때(예: string index나 string range) 다음 형식을 지원해요.
integer:string is integer -strict를 통과하는 인덱스 값의 경우 이 정수 인덱스가 가리키는 문자("abcd"에서 2는"c").end: 문자열의 마지막 문자("abcd"에서end는"d").end-N: 문자열의 마지막 문자에서 정수 오프셋 N을 뺀 것("end-1"은"abcd"에서"c").end+N: 문자열의 마지막 문자에 정수 오프셋 N을 더한 것("end+-1"은"abcd"에서"c").M+N: 정수 값 M과 N의 합인 정수 인덱스가 가리키는 문자("1+1"은"abcd"에서"c").M-N: 정수 값 M과 N의 차인 정수 인덱스가 가리키는 문자("2-1"은"abcd"에서"b").
위 설명에서 정수 값 M에는 뒤쪽 공백이, N에는 앞쪽 공백이 없어요.
예제
string 변수의 문자열이 foobar의 적절한 비어 있지 않은 접두사인지 검사해 볼게요.
set length [string length $string]
if {$length == 0} {
set isPrefix 0
} else {
set isPrefix [string equal -length $length $string "foobar"]
}