lua如何打印行号_Lua 字符串处理
今天項目中遇到一個字符串處理的通用函數,一時不明白胡亂搜索后才發現原來是字符串處理庫里面的通用函數,想著該理一遍字符串。
這個庫提供了字符串處理的通用函數。例如字符串查找,子串,模式匹配等。當在Lua中對字符串做索引時,第一個字符從1開始計算(而不是C里的0)。索引可以是負數。它指從字符串末尾反向解析。即,最后一個字符在-1位置處,等等。
字符串庫中的所有函數都在表string中,它還將其設置為字符串元表的__index域。因此,你可以7以面向對象的形式使用字符串函數。例如,string.byte(s,i)可以寫成s:byte(i)
字符串或串(String)是由數字,字母,下劃線組成的一串字符。
Lua語言中字符串可以使用以下三種方式來表示:
(1)單引號間的一串字符。
(2)雙引號間的一串字符。
(3)[[和]]間的一串字符。
以下三種方法的字符串實例如下:
string1 = "字符串1"
string2 = '字符串2'
string3 = [["字符串3"]]
轉義字符用于表示不能直接顯示的字符,比如后退鍵,回車鍵,等。如在字符串轉換雙引號可以使用"\"" 。
所有的轉義字符和所對應的意義:
字符串操作
Lua提供了很多的方法來支持字符串的操作:
字符串庫假定采用單字節符編碼。
1.string.byte(s[,i[,j]])
返回字符s[i],s[i+1],...,s[j]的內部數字編碼。i的默認值是1;j的的默認值是i。這些索引以函數string.sub的規則修正。
local str = "012abcd"
print(string.byte(str,1,4))
輸出結果為48 49 50 97
數字編碼沒有必要跨平臺。
2.string.char(...)
接收零或更多的整數。返回和參數數量相同長度的字符串。其中每個字符的內部編碼。其中每個字符的內部編碼值等于對應的參數值。
char 將整型數字轉成字符比連接,byte轉換字符為整數值(可以指定某個字符,默認第一個字符)。
string.char(97,98,99,100)
-- a b c d
string.byte("ABCD",4)
--68
string.byte("ABCD")
--65
3.string.dump(function[,strip])
返回包含有以二進制方式表示的(一個二進制代碼塊)指定函數的字符串。之后可以用load調用這個字符串獲得該函數的副本(但是綁定新的上值)。如果strip為真值。二進制代碼塊不攜帶該函數的調試信息(局部變量名,行號,等等。)。
帶上值得函數只保存上值得數目。當(再次)加載時,這些上值被更新為nil的實例。(你可以使用調試庫按你需要的方式來序列化上值,并重載到函數中)
首先新建一個文件將文件命名為Test.lua然后編輯如下代碼:
--自定義一個函數
function custom_func(num1, num2)
local ret = num1 + num2;
print("\nnum1 = "..num1)
print("num2 = "..num2)
print("num1 + num2 = "..ret)
end
-- 將函數序列化
local func_content = string.dump(custom_func)
print("\nfunc_content = "..func_content)
-- 將轉化后的字符串寫入文件
local outfile = io.open("dumptest.txt", "w")
local outnum = outfile:write(func_content)
outfile:close()
-- 從文件總讀取內容
local infile = io.open("dumptest.txt", "r")
local incontent = infile:read("*a")
infile:close()
print("\ninput content is "..incontent)
-- 加載函數
local myfunc = loadstring(incontent)
-- 執行函數
myfunc(1, 1)
myfunc(3, 6)
print(os.date())
運行結果如下
coderdeMac-mini:Desktop yingyingzhu$ lua Test.lua
func_content = u�R
�@�@A@A�@�@�@�A�@�@�@A�@�print
num1 =num2 = num1 + num2 =
@Test.luanum1num2ret_ENV
input content is u�R
�@�@A@A�@�@�@�A�@�@�@A�@�print
num1 =num2 = num1 + num2 =
@Test.luanum1num2ret_ENV
num1 = 1
num2 = 1
num1 + num2 = 2
num1 = 3
num2 = 6
num1 + num2 = 9
Thu Jul 18 19:43:05 2019
coderdeMac-mini:Desktop yingyingzhu$
調用了函數string.dump()之后函數custom_func()被轉化為字符串保存在文件中,可以在使用時再取出來。這個函數一般在寫邏輯代碼應該用不到。更多的是做框架的時候用的功能,進過序列化的函數可以通過網絡傳送,轉化,再使用。
4.string.find(s,pattern[,init[,plain]])
查找第一個字符串s中匹配到的 pattern。如果找到一個匹配,find會返回s中關于它起始位置以及終點位置的索引;否則,返回nil。第三個可選數字參數init指明從哪里搜索;默認值為1,同時可以是負值。第四個可選參數為true時,關閉模式匹配機制。此時函數僅做直接的“查找子串”的操作,而pattern中沒有字符被看作魔法字符。注意,如果給定了plain,就必須寫上init。
如果在模式中定義了捕獲,捕獲到的若干值也會在兩個索引之后返回。
string.find("Hello lua user","lua",1)
輸出為7 ,9
5.string.format(formatstring,...)
返回不定數量參數的格式化版本,格式化串為第一個參數(必須是一個字符串)。格式化字符串遵循ISO C函數sprintf的規則。不同點在于選項*,h,L,l,n,p 不支持,另外還增加了一個選項q。q選項將一個字符串格式化為兩個雙引號括起,對內部字符做恰當的轉義處理的字符串。該字符串可以安全的被Lua解釋器讀出來。例如,調用
string.format('%q', 'a string with "quotes" and\nnew line')
會產生字符串:
"a string with\"quotes\"and\new line"
string.format("the value is:%d",4)
the value is:4
5.string.gmatch(s,pattern)
返回一個迭代器函數。每次調用這個函數都會以pattern對s做匹配,并返回所有捕獲到的值。如果pattern中沒有指定捕獲,則每次捕獲整個pattern.
下面這個例子會循環迭代字符串s中所有的單詞,并逐行打印:
s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
print(w)
end
下一個例子從指定的字符串中收集所有的鍵值對key = value置入一張表:
s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
print(w)
end
6.string.gsub(s,pattern,repl[,n])
將字符串s中,所有的(或是在n給出時的前n個) pattern都替換成repl,并返回其副本。repl可以是字符串、表,或函數。gsub還會在第二個返回值返回一共發生多少次匹配。gsub這個名字來源于Global SUBstitution。
如果repl是一個自付出,那么把這個自婦產作為替換品。字符%是一個轉義符:repl中的所有形式為%d的串表示第d 個捕獲到的子串,d可以是1到9。串%0表示整個匹配,串%%表示單個%。
如果repl是張表,每次匹配時都會用第一個捕獲物作為鍵去查這張表。
如果repl是個函數u,則在每次匹配發生時都會調用這個函數。所有捕獲到的子串依次作為參數傳入。
任何情況下,模板中沒有設定捕獲都看成是捕獲這個模板。
如果表的查詢結果或函數的返回結果是一個字符串或是個數字,都將其作為替換用串;而在返回false 或nil時不作替換(即保留匹配前的原始串)。
--常規替換
x = string.gsub("hello world","(%w+)","lua")
print("1.",x)
--都有匹配的第一個串*2來替換
x = string.gsub("hello world","(%w+)","%1 %1")
print("2.",x)
--用匹配的完成串*2來替換第一次匹配的結果
x = string.gsub("hello world","%w+","%0 %0",1)
print("3.",x)
x = string.gsub("hello world","%w+","%0 %0")
print("3.1",x)
x = string.gsub("hello world","%w+","%0")
print("3.2",x)
x = string.gsub("hello world","%w+","%0%0")
print("3.3",x)
x = string.gsub("hello world","%w+","%0",1)
print("3.4",x)
x = string.gsub("hello world","%w+","%0 %0 %0",1)
print("3.5",x)
x = string.gsub("hello world","%w+","%0 %0 %0 %0",1)
print("3.6",x)
--使用一個完整匹配和一個匹配的第二個串來替換
x = string.gsub("os = $OS,pathext = $PATHEXT","%$(%w+)",os.getenv)
print("4.",x)
--調用自定義函數
x = string.gsub("4 + 5 = $return 4 + 5$","$(.-)%$",function(s)
return loadstring(s)()
end)
print("5.",x)
--調用表來替換
local t = {name = "lua",version = "5.1"}
x = string.gsub("$name - $version.tar.gz","%$(%w+)",t)
print("6.",x)
第三個部分不容易理解,所以我這邊寫了很多測試函數,運行結果如下
coderdeMac-mini:Desktop yingyingzhu$ lua Test.lua
1.lua lua
2.hello hello world world
3.hello hello world
3.1hello hello world world
3.2hello world
3.3hellohello worldworld
3.4hello world
3.5hello hello hello world
3.6hello hello hello hello world
4.os = $OS,pathext = $PATHEXT
5.4 + 5 = 9
6.lua - 5.1.tar.gz
7.string.len(s)
接收一個字符串,返回其長度。空串""的長度為0。內嵌零也統計在內,因此"a\000bc\000"的長度為5
string.len("abc")
結果為 3
8.string.lower(s)
接收一個字符串,將其中的大寫字符都轉為小寫后返回其副本。其它的字符串不會更改。對大寫字符的定義取決于當前的區域設置。
9.string.match(s,pattern[,init])
在字符串s中找到第一個能用pattern匹配到部分。如果能找到,match返回其中的捕獲物;否則返回nil。如果pattern中未指定捕獲,返回整個pattern捕獲到的串。第三個可選數字參數init指明從哪里開始搜索;它默認為1且可以是負數。
string.match("I have 2 questions for you.","%d+ %a+")
print(string.match("I have 2 questions for you.","%d+ %a+"))
string.match("I have 2 questions for you.","%a+ %d+")
print(string.match("I have 2 questions for you.","%a+ %d+"))
coderdeMac-mini:Desktop yingyingzhu$ lua Test.lua
2 questions
have 2
10.string.pack(fmt,v1,v2,...)
返回一個打包了(即以二進制形式序列化)v1,v2等值得二進制字符串。字符串fmt為打包格式。
11.string.packsize(fmt)
返回以指定格式用string.pack打包的字符串的長度。格式字符串中不可以有變長選項's'或'z'。
12.string.rep(s,n[,sep])
返回n個字符串s以字符串sep為分割符連在一起的字符串。默認的sep值為空字符串(即沒有分割符)。如果n不是正數則返回空串。
string.rep("abcd",2)
輸出為 abcdabcd
13.string.reverse(s)
返回字符串s的翻轉串。
14.string.sub(s,i[,j])
返回s的子串,該子串從i 開始到j為止;i和j都可以為負數。如果不給出j,就當它是-1(和字符串長度相同)。特別是,調用string.sub(s,1,j)可以返回s的長度為j的前綴串,而string.sub(s,-i)返回長度i的后綴串。
如果在對負數索引轉義后小于1的話,就修正回1。如果j比字符串的長度還大,就修正為字符串長度。如果在修正之后,i大于j,函數返回空串。
15.string.unpack(fmt,s[,pos])
返回以格式fmt打包在字符串s中的值。選項pos(默認為1)標記了從s中哪里開始讀起。讀完所有的值后,函數返回s中第一個未讀字節的位置。
16.string.upper(s)
接收一個字符串,將其中的小寫字符都轉為大寫后返回其副本。其它的字符串不會更改。對小寫字符的定義取決于當前的區域設置。
二 匹配模式
Lua中的匹配模式直接用常規的字符串來描述。它用于模式匹配函數string.find,string.gmath,string.gsub,string.match。這一節表述了這些字符串的語法及含義(即它能匹配到什么)。
字符類:
字符類用于表示一個字符集合。下列組合可用于字符類:
x: (這里 x 不能是 魔法字符 ^$()%.[]*+-? 中的一員) 表示字符 x 自身。
.: (一個點)可表示任何字符。
%a: 表示任何字母。
%c: 表示任何控制字符。
%d: 表示任何數字。
%g: 表示任何除空白符外的可打印字符。
%l: 表示所有小寫字母。
%p: 表示所有標點符號。
%s: 表示所有空白字符。
%u: 表示所有大寫字母。
%w: 表示所有字母及數字。
%x: 表示所有 16 進制數字符號。
%x: (這里的 x 是任意非字母或數字的字符) 表示字符 x。 這是對魔法字符轉義的標準方法。 所有非字母或數字的字符 (包括所有標點,也包括非魔法字符) 都可以用前置一個 '%' 放在模式串中表示自身。
[set]: 表示 set 中所有字符的聯合。 可以以 '-' 連接,升序書寫范圍兩端的字符來表示一個范圍的字符集。 上面提到的 %x 形式也可以在 set 中使用 表示其中的一個元素。 其它出現在 set 中的字符則代表它們自己。 例如,[%w_] (或 [_%w]) 表示所有的字母數字加下劃線), [0-7] 表示 8 進制數字, [0-7%l%-] 表示 8 進制數字加小寫字母與 '-' 字符。
交叉使用類和范圍的行為未定義。 因此,像 [%a-z] 或 [a-%%] 這樣的模式串沒有意義。
[^set]: 表示 set 的補集, 其中 set 如上面的解釋。
所有單個字母表示的類別(%a,%c,等),若將其字母改為大寫,均表示對應的不急。例如,%S表示所有非空格的字符。
如何定義字母、空格、或是其他字符組取決于當前的區域設置。特別注意:[a-z]未必等價于%l。
模式條目:
模式條目 可以是
單個字符類匹配該類別中任意單個字符;
單個字符類跟一個 '*', 將匹配零或多個該類的字符。 這個條目總是匹配盡可能長的串;
單個字符類跟一個 '+', 將匹配一或更多個該類的字符。 這個條目總是匹配盡可能長的串;
單個字符類跟一個 '-', 將匹配零或更多個該類的字符。 和 '*' 不同, 這個條目總是匹配盡可能短的串;
單個字符類跟一個 '?', 將匹配零或一個該類的字符。 只要有可能,它會匹配一個;
%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 。
總結
以上是生活随笔為你收集整理的lua如何打印行号_Lua 字符串处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么样 信号_深圳停止商务公寓用地审批释
- 下一篇: pythontxt文件怎么读_pytho