Programming/TclTk
TCL 스트링과 패턴 매칭
Hunveloper
2022. 9. 2. 08:31
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