Tcl의 문자열

admin의 아바타

Tcl은 문자열 처리를 기본으로 하고 있는 커맨드 언어이기에, 다른 언어에 비해 문자열 처리 기능은 충실한 편 입니다.

보통 if, while, for의 제어문은 아래 처럼 간단하게 문자열 비교를 할수 있습니다.

set str "abc"
if {$str == "abc"} {
     puts 같음
}

하지만, if, while, for의 제어문은 내부에서 expr 커맨드를 호출하기 때문에, 아래와 같이 숫자와 같은 문자열("0x10")을 비교하려하면, 숫자로 변환한 후의 문자열로 비교 하기 때문에, 불편한 점도 있습니다.

set str 16
if {$str == "0x10"} {
     puts 같음
}

switch는 내부에서 expr 커맨드를 호출하지 않기 때문에, 문자열 비교가 됩니다. 반대로 숫자 비교는 지원하지 않습니다.

set str 16
switch -- $str  {
        0x10    {puts 같지 않음}
        16      {puts 같음}
        default {puts 같나?}
}

switch 사용시 정규 표현에 의한 패턴매치를 사용시 -regexp, -glob 옵션을 사용합니다.

set str 16
switch -regexp -- $str  {
        0x10    {puts 같지 않음}
        16*     {puts 같음}
        default {puts 같나?}

string 커맨드

if, while, for의 제어문에서 문자열로 비교하고 싶은 경우에는, string 커맨드를 사용하는 것이 안전합니다. string compare는 2개의 문자열이 같으면 0을 리턴, string equal은 2개의 문자열이 같으면 1을 리턴합니다.

set str abc
if {![string compare $str "abc"]} {
     puts 같음
}

set str abc
if {[string equal $str "abc"]} {
     puts 같음
}

string match 커맨드를 사용하면 glob 형식의 정규 표현을 사용한 패턴 매치가 가능하기 때문에 편리합니다. string match는, 문자열이 패턴 매치가 된다면 1을 리턴합니다.

set str abc
if {[string match "ab*" $str]} {
     puts 같음
}

string 커맨드는 아래의 옵션을 지원합니다.

string bytelength string 유니코드(UTF-8)를 기본으로한 바이트 수를 리턴합니다.
string compare ? -nocase? ? -length int? string1 string2 문자열을 비교합니다. 2개의 문자열이 같으면 0을 리턴합니다. string1이 string2의 사전순서보다 앞이면 -1, 뒤면 1을 리턴합니다. -nocase 옵션을 지정하면 대소문자를 구별하지 않습니다. -length 옵션으로 문자길이를 지정할 수 있습니다.
string equal ? -nocase? ? -length int? string1 string2 문자열을 비교합니다. 2개의 문자열이 같으면 1, 다르면 0을 리턴합니다.
string first string1 string2 ? startIndex? string2를 검색하여 string1이 발견된 위치의 인덱스를 리턴합니다. 문자열이 발견되지 않았다면 -1을 리턴합니다. startIndex로 검색 위치를 지정할 수 있습니다.
string index string charIndex string상의 charIndex로 지정한 인덱스의 문자를 리턴합니다.
string is class ? -strict? ? -failindex varname? string string이 class로 지정한 멤버라면 1을, 아니면 0을 리턴합니다. class는 alnum, alpha, ascii, boolean, control, digit, double, false, graph, integer, lower, print, punct, space, true, upper, wordchar, xdigit 중의 하나입니다.
string last string1 string2 ? startIndex? string2를 검색하여 string1이 마지막으로 검색된 위치의 인덱스를 리턴합니다. 문자열이 발견되지 않았다면 -1을 리턴합니다. startIndex로 검색 위치를 지정할 수 있습니다.
string length string string의 길이를 리턴합니다.
string map ? -nocase? charMap string string을 key와 value 쌍으로 구성된 charMap에 의하여 치환한후 리턴합니다.
string match ? -nocase? pattern string string이 pattern에 매치 되었다면 1을, 그렇지 않다면 0을 리턴합니다. pattern은 glob 형식의 정규표현을 사용합니다.
string range string first last string의 first 인덱스로부터 last 인덱스까지의 문자열을 리턴합니다.
string repeat string count string을 count만큼 반복된 문자열을 리턴합니다.
string tolower string ? first? ? last? string을 알파벳 소문자로 변환하여 리턴합니다.
string totitle string ? first? ? last? string의 첫 문자만 대문자, 이외는 소문자로 변환하여 리턴합니다.
string toupper string ? first? ? last? string을 알파벳 대문자로 변환하여 리턴합니다.
string trim string ? chars? string 전후의 공문자(스페이스, 탭, 뉴라인, 캐리지 리턴)을 삭제한 문자열을 리턴합니다. 공문자 이외를 삭제시 char에 문자를 지정합니다.
string trimleft string ? chars? string 처음의 공문자(스페이스, 탭, 뉴라인, 캐리지 리턴)를 삭제한 문자열을 리턴합니다. 공문자 이외를 삭제시 char에 문자를 지정합니다.
string trimright string ? chars? string 끝의 공문자(스페이스, 탭, 뉴라인, 캐리지 리턴)를 삭제한 문자열을 리턴합니다. 공문자 이외를 삭제시 char에 문자를 지정합니다.
string wordend string charIndex string의 charIndex 인덱스 위치의 단어의 끝 인덱스를 리턴합니다.
string wordstart string charIndex string의 charIndex 인덱스 위치의 단어의 시작 인덱스를 리턴합니다.

append 커맨드

append는 인자로 지정한 변수에 문자열을 추가하는 커맨드입니다. 지정한 변수가 존재하지 않으면 새로 변수를 만들어 문자열을 추가합니다.

set str abc
append str1 def ghi
set str1
=> abcdefghi

append str2 123 456
set str2
=> 123456

format 커맨드와 scan 커맨드

format은 ANSI C언어의 printf 함수와 같은 서식에 따른 문자열을 작성합니다.

format {%s = %d} 0x10 0x10
=> 0x10 = 16

scan은 ANSI C언어의 sscanf함수와 같은 서식에 따른 문자열을 분리해냅니다. 문자열을 분리해낸 수를 리턴합니다.

scan ABC-1 {%[A-Z]%d} var1 var2
=> 2
set var1
=> ABC
set var2
=> -1

regexp 커맨드와 regsub 커맨드

regexp는 정규표현에 의한 패턴 매칭에 의해 문자열을 분리합니다. regexp는 문자열의 일부가 패턴 매치 되었다면 1을 리턴합니다. 그렇지 않다면 0을 리턴합니다. 아래의 예는 URL를 protocol, host, path로 분리합니다.

set url <a href="http://www.foo.com/hoge/index.html<br />
regexp"
title="http://www.foo.com/hoge/index.html<br />
regexp"
>http://www.foo.com/hoge/index.html<br />
regexp</a> -- {([^:/]*)://([a-z_\.]+)([a-z_\./]+)} $url match protocol host path
=> 1
set match
=> <a href="http://www.foo.com/hoge/index.html<br />
set"
title="http://www.foo.com/hoge/index.html<br />
set"
>http://www.foo.com/hoge/index.html<br />
set</a> protocol
=> http
set host
=> <a href="http://www.foo.com<br />
set"
title="www.foo.com<br />
set"
>www.foo.com<br />
set</a> path
=> /hoge/index.html

regsub는 정규표현에 의한 패턴 매치로 문자열을 치환합니다. regsub는 치환한 문자열의 수를 리턴합니다. 아래의 예는 URL 전후의 불필요한 문자열을 삭제합니다.

set url <a href="http://www.foo.com/hoge/index.html<br />
regsub"
title="http://www.foo.com/hoge/index.html<br />
regsub"
>http://www.foo.com/hoge/index.html<br />
regsub</a> -all -- {http://|/index.html} $url {} var
=> 2
set var
=> www.foo.com/hoge

regexp와 regsub의 정규 표현에 의한 패턴 매치는 상당히 복잡하면서 강력합니다.