(轉載)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"是執行了函式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碼,預設是第一個