# String library
lua字符串庫包含很多強大的字符操作函數。字符串庫中的所有函數都導出在模塊string中。在lua5.1中,它還將這些函數導出作為string類型的方法。這樣假設要返回一個字符串轉的大寫形式,可以寫成ans = string.upper(s),也能寫成 ans = s:upper()。為了避免與之前版本不兼容,此處使用前者。
#### string.byte(s [, i [, j ]])
返回字符s[i ]、s[i + 1]、s[i + 2]、···、s[j ]所對應的ASCII碼。i的默認值為1;j的默認值為i。
> 示例代碼
~~~
print(string.byte("abc", 1, 3))
print(string.byte("abc", 3)) --缺少第三個參數,第三個參數默認與第二個相同,此時為3
print(string.byte("abc")) --缺少第二個和第三個參數,此時這兩個參數都默認為 1
-->output
97 98 99
99
97
~~~
#### string.char (···)
接收0個或更多的整數(整數范圍 :0~255);返回這些整數所對應的ASCII碼字符組成的字符串。當參數為空時,默認是一個 0。
> 示例代碼
~~~
print(string.char(96,97,98))
print(string.char()) --參數為空,默認是一個0,你可以用string.byte(string.char())測試一下
print(string.char(65,66))
-->output
`ab
AB
~~~
#### string.upper(s)
接收一個字符串s,返回一個把所有大寫字母變成小寫字母的字符串。
> 示例代碼
~~~
print(string.upper("Hello Lua")) -->output HELLO LUA
~~~
#### string.lower(s)
接收一個字符串s,返回一個把所有大寫字母變成小寫字母的字符串。
> 示例代碼
~~~
print(string.lower("Hello Lua")) -->output hello lua
~~~
#### string.len(s)
接收一個字符串,返回它的長度。
> 示例代碼
~~~
print(string.len("hello lua")) -->output 9
~~~
#### string.find(s, p [, init [, plain]])
在s字符串中第一次匹配 p字符串。若匹配成功,則返回p字符串在s字符串中出現的開始位置和結束位置;若匹配失敗,則返回nil。第三個參數init默認為1,并且可以為負整數,當init為負數時,表示從s字符串的string.len(s) + init 索引處開始向后匹配字符串p。第四個參數默認為false,當其為true時,只會把p看成一個字符串對待。
> 示例代碼
~~~
print(string.find("abc cba","ab"))
print(string.find("abc cba","ab",2))
--從索引為2的位置開始匹配字符串:ab
print(string.find("abc cba","ba",-1)) --從索引為7的位置開始匹配字符串:ba
print(string.find("abc cba","ba",-3)) --從索引為6的位置開始匹配字符串:ba
print(string.find("abc cba", "(%a+)",1))--從索引為1處匹配最長連續且只含字母的字符串
print(string.find("abc cba", "(%a+)",1,true)) --從索引為1的位置開始匹配字符串:(%a+)
-->output
1 2
nil
nil
6 7
1 3 abc
nil
~~~
#### string.format(formatstring, ···)
按照格式化參數formatstring,返回后面···內容的格式化版本。編寫格式化字符串的規則與標準c語言中printf函數的規則基本相同:它由常規文本和指示組成,這些指示控制了每個參數應放到格式化結果的什么位置,及如何放入它們。一個指示由字符'%'加上一個字母組成,這些字母指定了如何格式化參數,例如'd'用于十進制數、'x'用于十六進制數、'o'用于八進制數、'f'用于浮點數、's'用于字符串等。在字符'%'和字母之間可以再指定一些其他選項,用于控制格式的細節。
> 示例代碼
~~~
print(string.format("%.4f", 3.1415926)) --保留4位小數
print(string.format("%d %x %o", 31, 31, 31))--十進制數31轉換成不同進制
d = 29; m = 7; y = 2015 --一行包含幾個語句,用;分開
print(string.format("%s %02d/%02d/%d", "today is:", d, m, y))
-->output
3.1416
31 1f 37
today is: 29/07/2015
~~~
#### string.match(s, p [, init])
在字符串s中匹配字符串p,若匹配成功,則返回目標字符串中與模式匹配的子串;否則返回nil。第三個參數init默認為1,并且可以為負整數,當init為負數時,表示從s字符串的string.len(s) + init 索引處開始向后匹配字符串p。
> 示例代碼
~~~
print(string.match("hello lua", "lua"))
print(string.match("lua lua", "lua", 2)) --匹配后面那個lua
print(string.match("lua lua", "hello"))
print(string.match("today is 27/7/2015", "%d+/%d+/%d+"))
-->output
lua
lua
nil
27/7/2015
~~~
#### string.gmatch(s, p)
返回一個迭代器函數,通過這個迭代器函數可以遍歷到在字符串s中出現模式串p的所有地方。
> 示例代碼
~~~
s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do --匹配最長連續且只含字母的字符串
print(w)
end
-->output
hello
world
from
Lua
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%a+)=(%a+)") do --匹配兩個最長連續且只含字母的
t[k] = v --字符串,它們之間用等號連接
end
for k, v in pairs(t) do
print (k,v)
end
-->output
to Lua
from world
~~~
#### string.rep(s, n)
返回字符串s的n次拷貝。
> 示例代碼
~~~
print(string.rep("abc", 3)) --拷貝3次"abc"
-->output abcabcabc
~~~
#### string.sub(s, i [, j])
返回字符串s中,索引i到索引j之間的子字符串。當j缺省時,默認為-1,也就是字符串s的最后位置。 i可以為負數。當索引i在字符串s的位置在索引j的后面時,將返回一個空字符串。
> 示例代碼
~~~
print(string.sub("Hello Lua", 4, 7))
print(string.sub("Hello Lua", 2))
print(string.sub("Hello Lua", 2, 1)) --看到返回什么了嗎
print(string.sub("Hello Lua", -3, -1))
-->output
lo L
ello Lua
Lua
~~~
#### string.gsub(s, p, r [, n])
將目標字符串s中所有的子串p替換成字符串r。可選參數n,表示限制替換次數。返回值有兩個,第一個是被替換后的字符串,第二個是替換了多少次。
> 示例代碼
~~~
print(string.gsub("Lua Lua Lua", "Lua", "hello"))
print(string.gsub("Lua Lua Lua", "Lua", "hello", 2)) --指明第四個參數
-->output
hello hello hello 3
hello hello Lua 2
~~~
#### string.reverse (s)
接收一個字符串s,返回這個字符串的反轉。
> 示例代碼
~~~
print(string.reverse("Hello Lua")) -->output auL olleH
~~~
#### 字符串連接
使用 ".."字符串連接符,能夠把多個字符串連接起來。如果連接符兩端出現不是字符串,那么會自動轉換成字符串。
> 示例代碼
~~~
print( "hello " .. "lua" )
print( "today:" .. os.date()) --你的輸出和我一樣嗎?
-->output
hello lua
today:07/29/15 17:29:24
~~~
- 序
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- 控制結構for的使用
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- Lua
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- web服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- c10k編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題