1. 程式人生 > 其它 >(轉載)lua的字串及字串格式化

(轉載)lua的字串及字串格式化

原文連結

字串的表示

  • ""
  • ''
  • [[]]
  • 被以上三項框起來的內容即為string, 當選用其上的任意一種方式來表示字串的時候,如果要字串中包含它本身的符號,則需要轉義。

    舉個例子: print("'I love Crane_Moker'") 輸出:‘I love Crane_Mocker’
    而 print(""lua is a nice language"") 則會報錯
    print("\"single dog\"") 輸出"single dog"

    string.format()

    這個函式類似於lua他媽媽,c語言中的printf(),提供了格式化的選擇
    舉個例子: print(string.format("Happy %d", 1024))

     輸出:Happy 1024
    注意,這裡字串"Happy 1024"是執行了函式string.format()的返回值,要想在終端顯示它,還需要print()

    引數 解釋
    %c 接受一個數字, 並將其轉化為ASCII碼錶中對應的字元
    %d, %i 接受一個數字並將其轉化為有符號的整數格式
    %o 接受一個數字並將其轉化為八進位制數格式
    %u 接受一個數字並將其轉化為無符號整數格式
    %x 接受一個數字並將其轉化為十六進位制數格式, 使用小寫字母
    %X 接受一個數字並將其轉化為十六進位制數格式, 使用大寫字母
    %e 接受一個數字並將其轉化為科學記數法格式, 使用小寫字母e
    %E 接受一個數字並將其轉化為科學記數法格式, 使用大寫字母E
    %f 接受一個數字並將其轉化為浮點數格式
    %g(%G) 接受一個數字並將其轉化為%e(%E, 對應%G)及%f中較短的一種格式
    %q 接受一個字串並將其轉化為可安全被Lua編譯器讀入的格式
    %s 接受一個字串並按照給定的引數格式化該字串

    這裡還有在%之後以控制格式的引數

    引數 解釋 不帶該引數的預設情況
    + 其後的數字轉義符將讓正數顯示正號 只有負數顯示符號
    0 指定了字串寬度時用0佔位 空格佔位
    - 左對齊 右對齊
    (m).(n) m字串裁切位數,n小數保留位數  

    匹配模式

    string.gmatch(str, pattern)和string.match(str, pattern, init)

    string.gmatch()有迭代器,可以匹配目標str中的所有符合pattern要求的部分(在for迴圈之類的裡面使用這個會是不錯的選擇)。
    而string.match()則只能匹配第一個,init決定了開始匹配的位置,預設是1(不要忘記了,在lua的table中預設以1開始哦)

    匹配的pattern ?

    引數 匹配
    .(點) 與任何字元配對
    %a 與任何字母配對
    %c 與任何控制符配對(例如\n)
    %d 與任何數字配對
    %l 與任何小寫字母配對
    %p 與任何標點(punctuation)配對
    %s 與空白字元配對
    %u 與任何大寫字母配對
    %w 與任何字母/數字配對
    %x 與任何十六進位制數配對
    %z 與任何代表0的字元配對
    %x(此處x是非字母非數字字元) 與字元x配對. 主要用來處理表達式中有功能的字元(^$()%.[]*±?)的配對問題, 例如%%與%配對
    [數個字元類] 與任何[]中包含的字元類配對. 例如[%w_]與任何字母/數字, 或下劃線符號(_)配對
    [^數個字元類] 與任何不包含在[]中的字元類配對. 例如[^%s]與任何非空白字元配對

    lua中特殊字元有( ) . % + - * ? [ ^ $, 所以匹配是就需要%來轉義,即上表中的%x

    模式條目

    符號 涵義
    * 將匹配零或多個該類的字元。 這個條目總是匹配儘可能長的串
    + 將匹配一或更多個該類的字元。 這個條目總是匹配儘可能長的串
    - 將匹配零或更多個該類的字元。 和 ‘*’ 不同, 這個條目總是匹配儘可能短的串
    ? 將匹配零或一個該類的字元。 只要有可能,它會匹配一個
    %n 這裡的 n 可以從 1 到 9; 這個條目匹配一個等於 n 號捕獲物(後面有描述)的子串。
    %bxy 這裡的 x 和 y 是兩個明確的字元; 這個條目匹配以 x 開始 y 結束, 且其中 x 和 y 保持 平衡 的字串。 意思是,如果從左到右讀這個字串,對每次讀到一個 x 就 +1 ,讀到一個 y 就 -1, 最終結束處的那個 y 是第一個記數到 0 的 y。 舉個例子,條目 %b() 可以匹配到括號平衡的表示式。
    %f[set] 指 邊境模式; 這個條目會匹配到一個位於 set 內某個字元之前的一個空串, 且這個位置的前一個字元不屬於 set 。 集合 set 的含義如前面所述。 匹配出的那個空串之開始和結束點的計算就看成該處有個字元 ‘\0’ 一樣。

    上面這個表是什麼意思呢?不妨讓我用*和+為大家舉個例子:

    print(string.match("Hello 1024", "%d")) 我們知道,string.match只匹配匹配到的第一個,所以這裡可以匹配到符合pattern的部分,也就是在該字串中的第一個數字1,所以輸出為 1

    print(string.match("Hello 1024", "%d+")) , 加號使條目儘可能長,所以這裡輸出為1024

    print(string.match("Hello 1024", "%d*")), 由於*可以匹配到0個或多個該類字元,在這個字串裡,當然是先遇到了H,所以這裡沒有輸出

    print(string.match("1024Hello", "%d*")), 就可以愉快輸出1024啦

    順嘴一提 string.char(arg) 和 string.byte(arg[,int])

    string.char()有一個或多個引數,顧名思義,是將數字轉化為字元,當然,它可以將它們連起來,成為str

    string.byte()則將字串的第指定(init)個字元返回對應的ascii碼,預設是第一個