Lua中字串庫的一些操作

2021-07-25 17:22:09 字數 3840 閱讀 6286

在lua裡面程式只能建立字串常亮、鏈結字串及獲取字串的長度。但是呢,它無法作進一步的操作,就是說,它無法提取子串或者檢索字串的內容。在lua裡面真正的字串操作能力來自於字串庫(string)。

s="hello lua"

string.len(s) --返回字串的長度

string.rep(s) --返回字串重複n次的結果

s:rep(n) --返回字串重複n次的結果

例如,可以用string.rep(「a」,2^20)來建立乙個1mb的字串。

string.lower(s)   --可返回乙份s的副本,其中大寫字母都被轉為小寫字母,其他不變

string.upper(s) --和上面的相反

大小寫轉換函式有乙個經典的用途,假設需要對乙個字串陣列進行排序,並且不區分大小寫。

string.sub(s, i[,j])

string.sub(s,i,j) --可以從字串s中提取第i個到第j個字元(第乙個字元的索引是0)

在lua中字串的第乙個字元的索引是1.還可以用負數索引,這樣就會從字串的尾部開始計數,索引-1代表最後乙個字元,-2代表倒數第二個字元。

s:sub(1,j)

string.sub(s,1,j) --獲取字串s的前j個字元

s:sub(j) --第二個引數預設為-1

string.sub(s,j,-1)--獲取從s的第j個字元開始到最後的字串

string.sub(s,2,-2)--去掉s的前乙個和最後乙個字元並返回

記住,lua中的字串是不可變的。和lua中的所有其他函式一樣,string.sub不會改變字串的值,它只會返回乙個新的字串。

函式string.char和string.byte用於轉換字元及其內部數值表示。string.char函式接受0個或多個整數,並將每個整數轉換成對應的字元,然後返回乙個由這些字元鏈結而成的字串。string.byte(s,i)返回字串s中第i個字元的內部數值表示,它的第二個引數是可選的,呼叫string.byte(s)可返回字串s中第乙個字元的內部數值表示。

print(string.char(97))        -->  a

i=99; print(string.char(i,i+1,i+2)) --> cde

print(string.byte("abc")) --> 97

print(string.byte("abc",2)) --> 98

print(string.byte("abc",-1)) --> 99

在lua5.1中,string.byte還可以接受可選的第三個引數。呼叫string.byte(s,i,j)可以返回索引i到j之間(包括i,j)的所有字元的內部表示。(沒有第三個引數時,預設j=i)!!!這個特性lua很多地方都用到了!!!

函式string.format是用於格式化字串的利器,經常用在輸出上。它會根據第乙個引數的描述,返回後續其他引數的格式化版本,這第乙個引數也稱為「格式化字串」。編寫格式化字串的規則與c語言中printf等函式的規則基本相同:乙個指示器字元『%』加上乙個字母組成,d用於十進位制、x用於十六進製制、o用於八進位制、f用於浮點數、s用於字串等。在百分號和字母之間可以在指定一些其他選項,用於控制格式的細節:

print(string.string.format("pi=%.4f", math.pi))       -->pi=3.1416

d=5;m=11;y=1990

print(string.format("%02d/%02d/%04d",d,m,y)) -->05/11/1990

tag,title="hi","atitle"

print(string.format("<%s>%s",tag,title,tag)) -->

字串庫中最強大的函式是find、match、gsub(global substitution,全域性替換)和gmatch(global match,全域性匹配),他們都是基於模式的。

string.find函式用於在乙個給定的目標字串中尋找乙個模式。最簡單的方式就是返回乙個單詞:

s="hello world"

i,j=string.fill(s, "hello")

print(i,j) -->1 5

print(string.sub(s,i,j)) -->hello

print(string.find(s,"world")) -->7 11

i,j=string.find(s,"l")

print(i,j) -->3 3

print(string.fill(s, "lll")) -->nil

string.find函式還具有乙個可選的第三個引數,它是乙個索引,告訴函式應該從目標字串的哪乙個位置開始搜尋。當處理所有與給定模式相匹配的部分時,這個引數就很有作用。可以重複搜尋新的匹配,並且每次搜尋都從上一次找到的位置開始:

local t={}                       --儲存索引的table

local i=0

while true do

i=string.find(s,"\n",i+1) --查詢下乙個換行符

if i=nil then break end

t[#t+1]=i

end

string.find和string.match非常相似,不一樣的地方是,string.match返回的是目標字串與模式中相匹配的那部分子串,而非該模式所在的位置。

print(string.match("hello world","hello"))             -->hello

string.gsub有3個引數:目標字串、模式和替換字串。它的基本用法就是將目標字串中所有出現模式的地方替換為替換字串(最後乙個引數):

s=string.gsub("lua is cute","cute","greate")

print(s) -->lua is greate

s=string.gsub("all lii","l","x")

print(s) -->axx xii

s=string.gsub("lua is great","sol","sun")

print(s) -->lua is great

--另外還有第四個可選引數,可以限制替換的次數:

s=string.gsub("all lii","l","x",1)

print(s) -->axl lii

s=string.gsub("all lii","l","x",2)

print(s) -->axx lii

函式string.gsub還有另乙個結果,即實際替換的次數。例如,以下**就是一種統計字串中空格數量的簡單方法:

cout=select(2,string.gsub(str," "," "))

這個是返回所有目標字串中符合規範的字串,「%a+」表示匹配乙個或多個字母字串行(單詞)。

字串的一些操作

一,把字串的首字母大寫返回乙個新的字串 1.1簡單寫法,把乙個單詞的首字母大寫 string.prototype.firstuppercase function 1.2字串中所有單詞首字母大寫,非首字母小寫 string.prototype.firstuppercase function 另一種寫法...

C中的一些字串操作

函式定義 char strchr const char s,char c 表頭檔案 include 函式說明 查詢字元 串s中首次出現字元c的位置,返回首次出現c的位置的指標 如果s中不存在c則返回null 表頭檔案 include 函式定義 int strncasecmp const char s...

字串的一些基本操作

下面是字串的一些基本操作,但是筆者在這裡流下了一點操作,看看哪位讀者能夠說明錯誤的地方在 怎麼改進它。include string.h include stdio.h include stdlib.h include io.h include math.h include time.h define...