반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Data and Files 첫번째 시간 - String -

2011. 10. 11. 22:47 | Posted by 솔웅


반응형

코로나에서 String을 다루는 방법이 첫번째 살펴볼 주제있니다.
Data and Files 에는 String, Table (Array), Math, Database (SQLite), Files, Crypto 등의 이슈가 있습니다.

첫번째 시간으로 String 인데요.
오늘 배울 부분들을 제가 연습하느라고 샘플 코드를 작성해서 공부했었는데요.
이것을 올려드릴께요.

오늘 글을 보면서 이 샘플코드에 직접 이것 저것 바꿔보면서 출력되는 것을 보면 좀 더 이해가 쉬울것 같습니다.


이 소스를 돌려보면 터미널에 결과값들이 찍힙니다.

String Manipulation

String Library 는 string 을 다루는 함수들을 제공해 줍니다.
루아에서 스트링을 인덱스 할 때 첫번째 문자는 포지션 1 입니다. (C 나 자바와 같이 0이 아닙니다.)
이 숫자는 마이너스도 허용합니다. 이 경우 스티링 맨 마지막에서부터 뒷쪽으로 검색하게 됩니다.
그러니까 마지막 문자가 -1이 됩니다.
String library는 테이블 스트링으로 이러한 함수기능을 제공합니다. 또한 스트링 테이블의 _index 필드에 스트링에 대한 메타테이블도 세팅 되어 있습니다. 이것을 개발자들은 객체 지향 개념으로 이용할 수 있습니다. 예를 들어 string.byte(s,i)는 s:byte(i)로 바꿔도 결과 값은 같습니다..

string.byte(s[,i[,j]])
문자 s[i],s[i+1] 문자의 내부 numerical code가 리턴 됩니다. 디폴트는 1 입니다. j의 디폴트 값은 i값입니다. 이 numerical code는 서로 다른 플랫폼간의 이동 및 공유가 되지 않습니다.

string.char(...)
0 이상의 integer를 Receive 받습니다. argument 숫자 길이 만큼 스트링이 리턴 됩니다. 근데 이건 제가 이것 저것 넣어 봤는데.. 결과값이 안 나오더라구요. 혹시 여러분 중에 무엇인지 아시는 분 댓글 부탁드립니다.

string.find(s,pattern[,init[,plain]])
스트링 s내에서 패턴에 맞는 첫번째를 찾습니다. 매치 되는 것을 찾으면 s의 인텍스를 리턴합니다. 없으면 nil을 리턴합니다. 세번째 옵션으로 있는 init 검색을 시작할 위치를 나타냅니다. 디폴트는 1이고 마이너스 값도 올 수 있습니다. 네번째 plain이 false일 경우 pattern matching 이 turn off 됩니다. plain이 있으면 init은 반드시 있어야 됩니다.
패턴이 검색 되면 이 검색된 패턴이 리턴됩니다.

string.format(formatstring,...)
매치 되면 미리 formatted 된 버전이 리턴됩니다. format string은 일반 C 함수의 printf 와 유사한 기능이 있습니다. 다른 점은 옵션들 입니다. l,L,n,p,h 는 support 되지 않습니다. 그리고 q 라는 옵션이 제공 됩니다. q는 루아 번역기가 읽기 쉬운 형태로 스트링을 포맷합니다.

예를 들어
  string.format('%q', 'a string with "quotes" and \n new line')

      "a string with \"quotes\" and \
      new line"
로 포맷 됩니다.

c, d, E, e, f, g, G, i, o, u, X, and x 옵션은 argument로 숫자가 들어가게 됩니다. 그리고 q와 s 는 문자가 들어가게 됩니다.

샘플코드에 이런 패턴들을 다 넣어 봤습니다. 결과값들이 다 다르게 나오는데 어떤건지 잘 와 닿지가 않네요. 실제 상황에서는 어떻게 써 먹는 건지도 모르겠구요.
제 프로그래밍 경력이 많지 않고 또 깊지 않아서 잘 모르는 것 같습니다. 혹시 이걸 어느 경우에 써 먹을 수 있는지 아시는 분들 조언 부탁 드립니다.

string.gmatch(s.pattern)
iterator 함수가 리턴 됩니다. 검색된 곳의 그 다음 capture 가 리턴 됩니다. 패턴이 없으면 전체가 매치된 것으로 나옵니다.
예를 들어
     s = "hello world from Lua"
     for w in string.gmatch(s, "%a+") do
       print(w)
     end
이것은 스트링 s의 모든 것을 iterate 합니다. 그리고 한줄당 하나씩 프린트 됩니다.
아래 예제는 key=value 의 모든 쌍들을 collect 합니다.
     t = {}
     s = "from=world, to=Lua"
     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
       t[k] = v
     end

샘플코드에 있으니까 직접 결과 값을 확인 해 보세요.

string.gsub(s,pattern,repl[,n])
이건 해석하거나 설명하기 좀 복잡하네요.
아래 샘플을 보시죠.
     x = string.gsub("hello world", "(%w+)", "%1 %1")
     --> x="hello hello world world"
     
     x = string.gsub("hello world", "%w+", "%0 %0", 1)
     --> x="hello hello world"
     
     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
     --> x="world hello Lua from"
     
     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
     --> x="home = /home/roberto, user = roberto"
     
     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
           return loadstring(s)()
         end)
     --> x="4+5 = 9"
     
     local t = {name="lua", version="5.1"}
     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
     --> x="lua-5.1.tar.gz"

좀 헛갈리네요. 저도 소스를 잘 분석해 봐야겠어요.
뭐 그렇게 쓸일이 있을까? 싶지만요.

아래 함수들은 많이 쓰일 것 같네요.

string.len(s)
s의 length를 반환합니다. 아무 값도 없으면 length는 0 입니다. embeded 0도 카운트 됩니다. 그래서 "a\000bc\000" 의 length 는 5 입니다.

string.lower(s)
스트링을 모두 소문자로 바꿉니다.

string.match(s,pattern[,init])
패턴에 맞는 첫번째 조건을 찾습니다. 찾으면 찾은 값을 리턴해 줍니다. 없으면 nil을 리턴해 줍니다. 패턴이 아무것도 없으면 모든 문자를 리턴합니다. 세번째 옵션값인 init 은 검색을 시작할 위치를 표시합니다.

string.rep(s,n)
n개의 수만큼 s를 표시합니다.

string.reverse(s)
s의 거꾸로 된 값을 리턴합니다.

string.sub(s,i[,j])
i 번째에서 j번째까지의 문자를 표시합니다. i,j는 마이너스가 될 수 있습니다. j가 없으면 -1이 디폴트 입니다. string.sub(s,1,j)는 j에 -1값이 들어가고 string.sub(s,-i)는 length i의 suffix를 리턴합니다.

string.upper(s)
모든 문자를 대문자로 바꿔 줍니다.

### Patterns

Character Class

캐릭터 클래스는 문자들의 세트를 표현합니다.

. (dot) 모든 문자를 표시한다.
%a : 모든 문자를 표시한다.
%c : control character들을 표시한다.
%d : 숫자들을 표시한다.
%l : 소문자를 표시한다.
%p : 기능 문자들을 표시한다.
%s : 스페이스를 표시한다.
%u : 대문자를 표시한다.
%w : 알파뉴메릭을 표시한다.
%x : 헥사디시멀 숫자들을 표시한다.
%z : 0으포 표시되는 문자를 출력한다.
%x (x가 알파벳 문자가 아닌 경우) 캐릭터 x를 표시한다.
[set] : 세트 안의 모든 문자들의 집합 클래스를 표시한다.
%w 나 _%w는 모든 알파뉴메릭 문자와 언더스코어를 표시하고 [0-7] 은 8진수를 [0-7%l%-]은 8진수와 소문자와 -를 표시한다.
[^set] : 위에 해당하는 것의 반대로 표시한다.
 %a , %c 등으로 표시 되는데 이것을 대문자로 표시하면 그것의 반대로 표시한다.
예를 들어 %S 의 경우는 non-space 문자들을 출력한다.

pattern item
패턴 아이템은 아래와 같은 조건을 갖는다.
- 클래스의 싱글 캐릭터에 매치 되는 싱글 캐릭터 클래스
- *로 시작하는 싱글 캐릭터 클래스 0번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 긴 시퀀스에 매치 된다.
- +로 시작하는 캐릭터. 1번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 가장 긴 시퀀스에 매치된다.
- -로 시작하는 캐릭터. 0번 이상 반복되는 캐릭터. 이 반복되는 아이템들은 가능한 가장 짧은 시퀀스에 매치된다.
- ? 로 시작하는 캐릭터.
- %n n은 1~9 사이이다. n번째 무자를 말한다.
- %bxy x와 y 는 두개의 구별되는 문자들이다. x에서 시작해서 y에서 끝난다.

이렇게 코로나의 String 다루는 법을 정리했습니다.

다음엔 코로나에서 사용하는 배열인 tables 에 대해 알아보겠습니다.
반응형