본문 바로가기
Programming/TclTk

TCL 스트링과 패턴 매칭

by Hunveloper 2022. 9. 2.
728x90

TCL 스트링과 패턴 매칭

스트링과 패턴 매칭

  • 스트링은 TCL에서 사용하는 기본 자료 구조
  • TCL은 스트링을 다루는 많은 명령을 보유
  • 스트링에서 특정 패턴을 찾아내는 패턴 매칭을 쉽게 할 수 있음
  • TCL은 Glob 매칭과 Regular Expression 매칭의 두 가지 패턴 매칭 방법을 제공

String 명령

  • String 명령의 기본 문법
string operation stringvalue ?otherargs?
  • operation 인자는 string 명령으로 무엇을 할 것인지를 나타냄
  • stringvalue 인자는 string 값
  • 그 외에 명령에 따라 인자가 더 올 수도 있다
  • string 명령의 여러 형태
    • string compare str1 str2 : 두 스트링을 비교. str1-str2 연산을 하여 str1이 사전순으로 앞이면 -1, str2가 사전순으로 앞이면 1을 리턴
    • string first str1 str2 : str2에서 str1이 처음으로 나타나는 위치. 미포함시 -1 리턴
    • string index string index_num : index_num번째 문자를 리턴
    • string last str1 str2 : str2에서 str1이 마지막으로 나타나는 위치를 리턴. 미포함시 -1 리턴
    • string length str : str에 포함된 문자수를 리턴
    • string match pattern str : str에 pattern이 포함여부. 포함시 1, 미포함시 0 리턴
    • string range str i j : str의 i번째부터 j번째까지의 스트링을 리턴
    • string tolower str : str을 모두 소문자로 바꾼 스트링을 리턴
    • string toupper str : str을 모두 대문자로 바꾼 스트링을 리턴
    • string trim str ?chars? : str의 양 끝에서 chars에 포함된 문자를 모두 삭제. chars의 default는 whitespace 문자들(space, tab 등)
    • string trimleft str ?chars? : trim의 경우와 동일하지만 str의 시작 부분에 있는 문자만 삭제
    • string trimright str ?chars? : trim의 경우와 동일하지만 str의 마지막 부분에 있는 문자만 삭제
    • string wordend str ix : ix번째 문자가 포함된 단어가 끝난 곳의 index를 리턴
    • string wordstart str ix : ix번째 문자가 포함된 단어가 시작된 곳의 index를 리턴

Append 명령

  • 여러 스트링을 합침
set foo z
append foo a b c

puts $foo

#zabc

format 명령

  • format 명령은 C의 printf와 유사
format spec value1 value2 ...
  • spec은 포맷 지정자로 화면에 찍힐 문자들과 키워드들로 구성
  • 키워드는 %로 시작
  • spec에는 보통 whilespace를 포함하기에 인용 부호를 사용하여 grouping하는 것이 일반적
  • spec에서 % 뒤에 붙여 사용할 수 있는 포맷 지정자
    • d : 정수
    • u : 부호 없는 정수
    • i : 정수. 16진수나 8진수를 쓸 수 있다.
    • o : 부호 없는 8진수
    • x 또는 X : 부호 없는 16진수. x를 쓰면 결과가 소문자로 찍히고 X를 쓰면 대문자로 찍힌다.
    • c : ASCII 문자
    • s : 스트링
    • f : 실수
    • e 또는 E : 지수형 표현. a.bE+-c와 같은 형태
    • g 또는 G : f나 e중 더 짧게 표현할 수 있는 형태로 표현
  • 위치 지정자는 a$의 형식으로 %와 포맷 지정자의 사이에 사용
set lang 2
format "%${lang}\$s" one un uno

Scan 명령

  • scan 명령은 C의 scanf와 유사
scan string format var1 var2 ...
  • scan은 [ ]를 사용해 입력 문자의 필터링이 가능
scan abcABC {%[a-z]} result
#1
set result
#abc

String 매칭

  • string match 명령은 glob 형태의 패턴 매칭을 수행
    • 기호는 어떤 문자열과 대응, *이후로 오는 문자의 개수는 상관 X
  • ? 기호는 하나의 문자와 대응
  • [ ]으로 문자를 묶으면 [ ]안에 포함된 임의의 한 문자와 대응
  • [ ]은 명령 치환을 위해 사용되는 기호이기도 하므로 치환을 방지하기 위해서는 { }를 이용해 grouping을 해야함
  • 패턴 일치하는 값이 있으면 1, 없으면 0을 반환
string match a* alpha
#1

string match ?? XY
#1

string match {[ab]*} cello
#0

Regular Expression

  • Regular Expression을 사용하면 더 강력한 패턴 매칭이 가능
  • Regular Expression에서 사용되는 문법
    • . : 어떤 임의의 한 문자와 대응
    • * : 이전 패턴 항목을 0 또는 1회 이상 반복
    • + : 이전 패턴 항목을 1회 이상 반복
    • ? : 이전 패턴 항목을 0 또는 1회 반복
    • ( ) : 패턴을 묶는다.
    • | : 두 가지 패턴 중 임의의 하나와 대응
    • [ ] : [ ] 안에 포함된 문자 중 임의의 하나와 대응. 안에 나오는 첫 번째 문자가 ^인 경우는 안의 문자를 제외한 모든 다른 문자와 대응 (Not 개념)
    • ^ : 문자열의 처음과 대응
    • $ : 문자열의 마지막과 대응
    • Example of Regular Expression*
    • .. : 임의의 두 글자
    • [Hh]ello : Hello 또는 hello
    • [^a-zA-Z] : 알파벳을 제외한 모든 문자
    • ba* : b, ba, baa, baaa, baaaa, ...
    • (ab)+ : ab, abab, ababab, ...
    • .* : 모든 스트링과 대응
    • hello|Hello : Hello 또는 hello

regexp 명령

  • regexp 명령은 regular expression을 이용한 패턴 매칭을 하는 명령
regexp ?flags? pattern string ?match sub1 sub2 ... ?
  • flags와 match 이후의 인자는 옵션
  • string에서 패턴과 일치하는 부분이 발견되면 1, 그렇지 않으면 0을 리턴
  • 패턴 안에 [ 나 $를 포함하는 경우에는 치환이 발생하지 않도록 { } 로 grouping하거나, [, $앞에 \을 붙여 역슬래쉬 치환을 이용
  • flags인자에 올 수 있는 값
    • -nocase : 대소문자를 구분하지 않음
    • -indices : match 이후의 변수에 스트링을 저장하지 않고, 해당 패턴이 시작하는 위치를 저장
  • 발견된 패턴은 match 변수에 저장됨
  • 패턴을 포함하는 sub 패턴들은 match 다음에 오는 변수에 차례로 저장
  • sub 패턴은 ( )로 구분
  • pattern이 -로 시작하는 경우는 플래그와 패턴을 구분하기 위해 —(double -)를 사용
puts [set env(DISPLAY) brutus:0.1]
puts [regexp {([^:]*):} $env(DISPLAY) match host]
puts $host

#brutus:0.1
#1
#brutus

 

728x90
728x90

'Programming > TclTk' 카테고리의 다른 글

TCL 순서제어 명령  (0) 2022.09.02
TCL 자료 구조  (0) 2022.09.02
TCL 기본  (0) 2022.09.01
TCL 설치하기  (0) 2022.09.01
TCL 별찍기와 산출물  (0) 2022.08.31

댓글