天天看點

Lua: string字元串的處理

目錄

1、字元串的三種表示方式

2、字元串操作

3、 特别說一下 dump序列化Lua 函數

1、字元串的三種表示方式

--[[ 
lua 字元串的三種表示
--]]

-- 單引号字元串
string_a = 'hello world'
print(string_a)

-- 雙引号字元串

string_b = "hello ,girl"
print(string_b)

-- [[ ]] 表示的字元串: 多行字元串

string_mutil_line = [[this is a beautiful day,
I have too many instering things to enjoy with you. ]]
print(string_mutil_line)
           

2、字元串操作

--[[ 
  字元串操作
--]]

string_op = "hEllo World";


-- 字元串轉大寫
print(string.upper(string_op))


-- 字元串轉小寫
print(string.lower(string_op))


-- 字元串替換
print(string.gsub(string_op,"o","O"))     -- 将字元串中的'o' 全部替換成'O'
print(string.gsub(string_op,"o","O",1))   -- 隻替換第一個


-- 查找子串
print(string.find(string_op,"llo",1))


-- 計算字元長度
print(string.len(string_op))

-- 傳回字元串string 的n個拷貝
print(string.rep(string_op,2))

-- 連結兩個字元串 ..
print(string_op..string_op)
print("message tips:"..string_op)

-- 查找符合pattern描述的子串 
--[[

下面的表列出了Lua支援的所有字元類:

單個字元(除 ^$()%.[]*+-? 外): 與該字元自身配對
.(點): 與任何字元配對
%a: 與任何字母配對
%c: 與任何控制符配對(例如\n)
%d: 與任何數字配對
%l: 與任何小寫字母配對
%p: 與任何标點(punctuation)配對
%s: 與空白字元配對
%u: 與任何大寫字母配對
%w: 與任何字母/數字配對
%x: 與任何十六進制數配對
%z: 與任何代表0的字元配對
%x(此處x是非字母非數字字元): 與字元x配對. 主要用來處理表達式中有功能的字元(^$()%.[]*+-?)的配對問題, 例如%%與%配對
[數個字元類]: 與任何[]中包含的字元類配對. 例如[%w_]與任何字母/數字, 或下劃線符号(_)配對
[^數個字元類]: 與任何不包含在[]中的字元類配對. 例如[^%s]與任何非空白字元配對
當上述的字元類用大寫書寫時, 表示與非此字元類的任何字元配對. 例如, %S表示與任何非空白字元配對.例如,'%A'非字母的字元:

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4
數字4不是字元串結果的一部分,他是gsub傳回的第二個結果,代表發生替換的次數。

在模式比對中有一些特殊字元,他們有特殊的意義,Lua中的特殊字元如下:

( ) . % + - * ? [ ^ $
'%' 用作特殊字元的轉義字元,是以 '%.' 比對點;'%%' 比對字元 '%'。轉義字元 '%'不僅可以用來轉義特殊字元,還可以用于所有的非字母的字元。

模式條目可以是:
單個字元類比對該類别中任意單個字元;
單個字元類跟一個 '*', 将比對零或多個該類的字元。 這個條目總是比對盡可能長的串;
單個字元類跟一個 '+', 将比對一或更多個該類的字元。 這個條目總是比對盡可能長的串;
單個字元類跟一個 '-', 将比對零或更多個該類的字元。 和 '*' 不同, 這個條目總是比對盡可能短的串;
單個字元類跟一個 '?', 将比對零或一個該類的字元。 隻要有可能,它會比對一個;
%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' 一樣。

模式:
模式 指一個模式條目的序列。 在模式最前面加上符号 '^' 将錨定從字元串的開始處做比對。 在模式最後面加上符号 '$' 将使比對過程錨定到字元串的結尾。 如果 '^' 和 '$' 出現在其它位置,它們均沒有特殊含義,隻表示自身。

捕獲:
模式可以在内部用小括号括起一個子模式; 這些子模式被稱為 捕獲物。 當比對成功時,由 捕獲物 比對到的字元串中的子串被儲存起來用于未來的用途。 捕獲物以它們左括号的次序來編号。 例如,對于模式 "(a*(.)%w(%s*))" , 字元串中比對到 "a*(.)%w(%s*)" 的部分儲存在第一個捕獲物中 (是以是編号 1 ); 由 "." 比對到的字元是 2 号捕獲物, 比對到 "%s*" 的那部分是 3 号。
作為一個特例,空的捕獲 () 将捕獲到目前字元串的位置(它是一個數字)。 例如,如果将模式 "()aa()" 作用到字元串 "flaaap" 上,将産生兩個捕獲物: 3 和 5 。

--]]

-- %d+ 數字
-- %a+ 字元串
for word in string.gmatch(string_op,"o %a+") do 
  print(word) 
end


-- 字元串截取
print(string.sub(string_op,2,4))


-- 字元串格式化
-- string.format(...)
--[[
%c - 接受一個數字, 并将其轉化為ASCII碼表中對應的字元
%d, %i - 接受一個數字并将其轉化為有符号的整數格式
%o - 接受一個數字并将其轉化為八進制數格式
%u - 接受一個數字并将其轉化為無符号整數格式
%x - 接受一個數字并将其轉化為十六進制數格式, 使用小寫字母
%X - 接受一個數字并将其轉化為十六進制數格式, 使用大寫字母
%e - 接受一個數字并将其轉化為科學記數法格式, 使用小寫字母e
%E - 接受一個數字并将其轉化為科學記數法格式, 使用大寫字母E
%f - 接受一個數字并将其轉化為浮點數格式
%g(%G) - 接受一個數字并将其轉化為%e(%E, 對應%G)及%f中較短的一種格式
%q - 接受一個字元串并将其轉化為可安全被Lua編譯器讀入的格式
%s - 接受一個字元串并按照給定的參數格式化該字元串
為進一步細化格式, 可以在%号後添加參數. 參數将以如下的順序讀入:

(1) 符号: 一個+号表示其後的數字轉義符将讓正數顯示正号. 預設情況下隻有負數顯示符号.
(2) 占位符: 一個0, 在後面指定了字串寬度時占位用. 不填時的預設占位符是空格.
(3) 對齊辨別: 在指定了字串寬度時, 預設為右對齊, 增加-号可以改為左對齊.
(4) 寬度數值
(5) 小數位數/字串裁切: 在寬度數值後增加的小數部分n, 若後接f(浮點數轉義符, 如%6.3f)則設定該浮點數的小數隻保留n位, 若後接s(字元串轉義符, 如%5.3s)則設定該字元串隻顯示前n位.


(5) 小數位數/字串裁切: 在寬度數值後增加的小數部分n, 若後接f(浮點數轉義符, 如%6.3f)則設定該浮點數的小數隻保留n位, 若後接s(字元串轉義符, 如%5.3s)則設定該字元串隻顯示前n位.
]]--
--]]

format_string=string.format("%d %c",12,97)
print(format_string)

print(string.format("10 --> %o %x",10,10))


string_op = "aAbB1";
-- 字元串轉内置編碼
-- string.byte(s:string [,i:number [, j:number]])  傳回字元串中指定起始位置字元的内置編碼
print(string.byte(string_op,1,5)) -- 97	65	98	66	49

-- 内置編碼轉字元串
-- 與 string.byte() 相反,string.char(...) 的作用是将字元編碼,傳回一個字元串
print(string.char(97	,65	,98	,66	,49)) -- aAbB1 


           

3、 特别說一下 dump序列化Lua 函數

function add(x,y)
  return x+y
end

-- dump 序列化函數,将函數轉換成包含函數的二進制表達的字元串
-- 好處: 可以通過網絡傳送、轉化和再使用
cpy_func_sequence = string.dump(add)

-- 加載函數
local func = loadstring(cpy_func_sequence)
print("2+3="..func(2,3))