... <看更多>
「lua string match」的推薦目錄:
- 關於lua string match 在 [心得] Lua和他快樂的字串函數們... - 看板mud_sanc 的評價
- 關於lua string match 在 How to check if matching text is found in a string in Lua? 的評價
- 關於lua string match 在 String Match in Lua VS Ngx 的評價
- 關於lua string match 在 pygy/strung.lua: Lua string patterns rewritten in Lua + FFI, for ... 的評價
- 關於lua string match 在 Tutorial for strings in Lua programming language - YouTube 的評價
lua string match 在 String Match in Lua VS Ngx 的推薦與評價
String Match in Lua VS Ngx. string.gfind 和ngx.re.gmatch 首先后者不用oj性能比不过前者;然后字符串越简单,前者性能越好。所以看要匹配的字符串是否复杂,可能的 ... ... <看更多>
lua string match 在 pygy/strung.lua: Lua string patterns rewritten in Lua + FFI, for ... 的推薦與評價
0-rc1 . a rewrite of the Lua string pattern matching functions in Lua + FFI, for LuaJIT. strung.find , strung.match ... ... <看更多>
lua string match 在 [心得] Lua和他快樂的字串函數們... - 看板mud_sanc 的推薦與評價
腳本語言Lua可用的字串函數,不限於Mushclient才能用。
整理一下比較好查閱,網路上的還是有點散亂。雖然總體來說
就三種版本貼來貼去的樣子。
目 錄
┌──────────┬─────────┬─────────────┐
│ 行 名稱 │ 行 名稱 │ 行 名稱 │
├──────────┼─────────┼─────────────┤
│ 19 string.len │ 46 string.rep │ 57 string.lower │
│ 69 string.upper │ 81 string.sub │110 string.byte │
│144 string.char │176 string.dump │182 string.find │
│217 string.match │250 Lua 的匹配字元│318 string.gsub │
│354 string.gmatch │378 string.format │422 string.reverse │
└──────────┴─────────┴─────────────┘
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
string.len(s):
功能:返回字串s的長度。
說明:計算一段字串的長度,包含不可見的控制字元。一般送到 Mushclient 畫面的內容是
已經被Mushclient解析過的文字,控制字元被解析後移除了, 所以不會算到換
行及色碼,
範例:a = string.len('你好嗎?')
print (a)
結果會是7。
b,a = '你好嗎?',string.len(b)
print (a)
如果先把字串寫入b,再代入string.len去計算長度,就不需在b兩側加上''(""也可
以,在lua兩者用途相同);如果加上了,b會被視為一個字串, 而非變數,就會
得到值為1。。
如果使用Mushclient 的 trigger,假設匹配的字串:
^(你好嗎?)$
執行的內容為:
print (string.len("%1"))
將得到值為7,%1的兩側就必須加上""。
string.rep(s, n)
功能:返回重複n次s的字串。
說明:把字串內容複製n遍,在有需要重複內容輸出,但要重複幾次不確定的時候,可能會
用到。
範例:a= string.rep(' ',5)
print (a)
重複半形空格五次後顯示。
string.lower(s)
功能:將s中的大寫字母轉換成小寫。
說明:用途很單純,而且只有英文字母才用得到。已經是小寫的就不會被轉換。因為Lua會
將大小寫有差異的兩者視為不同的字串或變數,所以還是有用得到的地方。
範例:a,b= 'anD','and'
print (a..' = '..b..'?',a == b)
print (string.lower(a)..' = '..b..'?',string.lower(a) == b)
可以看出差異所在。
string.upper(s)
功能:將s中的小寫字母轉換成大寫。
說明:用途很單純,而且只有英文字母才用得到。已經是大寫的就不會被轉換。因為Lua會
將大小寫有差異的兩者視為不同的字串或變數,所以還是有用得到的地方。
範例:a,b= 'and','and'
print (a..' = '..b..'?',a == b)
print (string.upper(a)..' = '..b..'?',string.lower(a) == b)
可以看出差異所在。
string.sub(s,i,j):
功能:函數擷取字串s的從第i個字元到第j個字元之間的字串。
說明:這個函數用法就比較多元了-
i為正數時,從開頭起算;負數則從結尾倒算回去。
j為正數時,意為取到第j個字元,負數時,就是從結尾開始數回去第j個字元。可以
不加,不加的時候,預設值為-1,即取到最後。
有設i才能設j。
範例:a = 'abcdefghijk'
print (string.sub(a,1))
>從第一個字元開始擷取,得:abcdefghijk
print (string.sub(a,2))
>從第二個字元開始擷取,得:bcdefghijk
print (string.sub(a,-1))
>從結尾開始擷取一個字元,得:k
print (string.sub(a,2,-1))
>從第二個字元起擷取,得:bcdefghijk
print (string.sub(a,2,-2))
>擷取第二個字元到倒數第二個字元,得:bcdefghij
print (string.sub(a,-5,-2))
>擷取倒數第五個字元到倒數第二個字元,得:ghij
string.byte(s,i,j)
功能:回傳從i到j的字元所對應的數值(ASCII值)。
說明:i預設為1,j預設為i的值。
中文字也可以得到相對的值。
範例:words = 'abcd123測試中!!'
print (string.byte(words,3))
回傳變數words裡第3個字元"c"的ASCII值:99
print (string.byte(words,3,4))
回傳變數words裡第3到4個字元"cd"的ASCII值:99 100
print (words:byte(2,5))
回傳變數words裡第2到5個字元"bcd1"的ASCII值:98 99 100 49
這個語法等同於print (string.byte(words,2,5)),冒號在Lua裡可以把右邊的值傳
遞給左邊的函數;類似的寫法可以在Mushclient的抓聊天訊息到新視窗的Plugin裡看
到。
a,b,c = words:byte(2,3)
print (a,b,c)
回傳變數words裡第2到3個字元"bc"的ASCII值:98 99 nil
這裡先把得到的值傳到a,b,c裡,再用print去顯示。當函數回傳的值不只一個,但希
望只得到其中一個值,可以這麼寫。但一般會如此寫:
_,b,_ = words:byte(2,3)
把不需要的值傳回變數_。
如果設定的變數名超過回傳的值數目,沒賦值的變數會顯示nil;反之,多餘的回傳值
會被捨棄。
print (string.byte(words,8,9))
回傳變數words裡第8到9個字元"測"的ASCII值:180 250
'測'是由兩個字元組成的,所以要設頭尾以得到兩個值。
string.char(...)
功能:回傳ASCII值所對應的字元(串)。
說明:把ASCII 碼轉變回對應字元的函數,有兩種輸入方式-10位元,直接輸入對應
數字;16位元,在數字前加上0x,表示為16位元。使用者數字使用習慣從1開始
不同,電腦從0開始。所以10位元的序列為:
0,1,2,3,4,5,6,7,8,9
16位元則是:
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
範例:#Send ('say '..string.char(0x1b).."[36mtest")
在輸出指令say test,並將test改成青色。
string.char(0x1b)輸出控制字元Esc,好讓伺服器端
能判讀內容帶有色碼。結果為:
齊格飛(HMML8:劍士)說道:test
print (string.byte('一',1,2))
回傳'一'的ASCII值:164 64
'一'在吃字榜上很有名氣,現在看一看這兩個字元分別對應什麼字,從值
的大小來看,應是第二個有問題:
print (string.char(164))
得值: ,這個字元不在PcMan的支援下,所以無法顯示。
print (string.char(64))
得值:@,剛好是zMUD的表意字元(Mushclient也是)
要組回去,可以用','分隔開一一列舉:
print (string.char(164,64))
要輸入一連串的值,如上所列般加逗號連接下去即可。
string.dump(function)
功能:返回指定函數的二進位代碼(函數必須是一個Lua函數,並且沒有上值)。
說明:這個不知道怎麼用。
string.find(s, pattern [, init [, plain]])
功能:尋找s中首次出現pattern的位置,如果找到則回傳首次出現的起始和結束位置,否則
返回nil
說明:這個函數有四個參數可用:
s:母體。
pattern:目標字串。
init:搜尋起始位置(數字,可用負值)。可加可不加。
palin:搜尋模式(true|false),開關簡單匹配模式。可加可不加,預設為簡單匹
配模式。
範例:a = '你的身上(wealth)帶有 6667570 影特幣,銀行存款(balance)有 63908926 影
特幣。'
print (string.find(a,'影特幣'))
得到:30 35,第一個值是起始位置,第二個值是結束位置。只有抓到第一個'影特幣
。如果要抓全部可以增加第三個參數,用迴圈執行:
for i = 1,10 do
i,j = string.find(a,'%d+ ',-j)
print(i,j)
if i == nil then break end
end
基本上,這個應該是用while...do...end 或repeat...until,不過,這對初學者而
言(就是我),太危險了,不如用能控制次數的for...end安全。先設一個差不多的
次數,這裡是設10次,不管寫對還是寫錯,10就會結束,至少不會死當。把起始值
傳給i,結束值傳給j,再把j設到string.find的第三個參數,下次就會從上次的結束
尋找位置開始找。這次就不管一樣的,改找數字,搜尋條件可以使用也表達式,不過
轉義字元不是'\',而是'%'。為了不做白工,所以加個判斷,找完之後就自行跳出迴
圈。結果如下:
第一組數字起始位置:22,結束位置:29。
第二組數字起始位置:58,結束位置:66。
"nil nil"代表己經找到最後了。
string.match(s,pattern[, init ])
功能:回傳目標字串中和模式字串匹配的部分。
說明:也就是從s中,找出和pattern條件相符的部份並回傳,和string.find一樣,它只會
匹配一次,找到一個就會停止動作,但可以選擇開始匹配的位置,只要在末尾在加上
一個參數即可。這個函數的重點在於表示式匹配,畢竟一模一樣的字串被匹配出來回
傳,並沒什麼意義。所以主要是用在找相同格式的字串。
範例:a = '你的身上(wealth)帶有 6667570 影特幣,銀行存款(balance)有63908926 影特
幣。'
print (string.find(a,'影特幣%S%S'))
找出前綴'影特幣',後面兩個字元長度的非空白字串相匹配的字串,得到第一個值:
影特幣,
print (string.match(a,'影特幣%S%S',38))
找出前綴'影特幣',後面兩個字元長度的非空白字串相匹配的字串,但是從第38個字
元找起,得到第二個值:影特幣。
實際上應該是找金額比較實用,透過匹配條件的設定,可以一次找兩個:
print (string.match(a,'(%d+) %S+ (%d+)'))
匹配前後都是數字組的字串,用()可以單獨取出需要的部份,得到值:
6667570 63908926
如果想指定取某個值,同樣:
i,j = string.match(a,'(%d+) %S+ (%d+)')
或
i,j = a:match('(%d+) %S+ (%d+)')
皆可。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Lua 的匹配字元
┌─┬─────────────────────────────────┐
│. │ 所有字符 │
│%a│ 字母,包含大小寫。 │
│%c│ 控制字符,如:ESC、換行等不可視字元大多都是。 │
│%d│ 數字,0-9,以外的都不是。 │
│%l│ 小寫字母,大寫字母和非字母都不算。但是%L並不等於%u。 │
│%p│ 標點符號,只有算單字元的那些,雙字元的都不算。 │
│%s│ 空白字符。這個還蠻常用的,對非英語語系來說。 │
│%u│ 大寫字母,小寫字母和非字母都不算。但是%U並不等於%l。 │
│%w│ 字母和數字字符。 │
│%x│ 十六進制數字。就當做是0-9加上a-f的集合。 │
│%z│ 內部表示為0的字符,這個不知何時用到。 │
└─┴─────────────────────────────────┘
以上這些都可以單獨使用,去做匹配,除了第一個外,將其它的匹配字元小寫改成大寫,就
會將功能反轉,如:%a 代表所有字母;而%A就是非字母。%c是匹配所有控制字元,%C就是
所有非控制字元。
另外,還有一些加強匹配效果的字元,有點主詞+形容詞的味道:
( ) % + - * ? [ ] ^ $
():用來補獲符合條件的字串內容,如果要將它做為匹配的條件之一,請在前方加上%。
%:轉義字元,用來告訴程式後面的字元,是字串的一部份,還是匹配用的字元,但本身就
是特殊用途的字元,加上它,就變成一般的字元。如果需要匹配%,為了讓它變一般的字
元,在前方加上%。如有一個字串'100%',要寫出符合條件的表達式,像這樣:
%d+%,因為末尾的%尚未被轉義,會視為跟第一個%相同作用,造成表達式本身錯誤,正
確要這麼寫%d+%%。
+:它是一種後綴字元,用來設定匹配字元的長度條件,表示這個匹配字元有多長,+代表1
個或更多,如%d+,代表這組數字至少為一位數,它匹配:"12","0","324567546"...等
。
-:同上,但條件為0或更多,跟*不同的地方是-為最少匹配,*為最多匹配。如:
print(string.match(1234567890,"(%d+)(%d+)"))
前方的%d+會取到能讓表達式匹配成功的極限,得結果:123456789和0
print(string.match(1234567890,"(%d-)(%d+)"))
前方的%d-即使不取值,也能匹配,將所有數值都讓給%d+,得:""和1234567890
""不代表它匹配失敗,它有取到值,不是nil
print(string.match(1234567890,"(%d*)(%d+)"))
前方的%d*會取到能讓表達式匹配成功的極限,得結果:123456789和0
*:同上,但條件為0或更多,其它前一條講完了。
?:條件是0或1個。模式是最大匹配,跟*相同,只是當?佔先手時,最也多取一位數,*佔先
手時,會取到讓後手滿足匹配的最底限為止。
[]:是一個集合,你可以把你要匹配的內容放進去,但要記住,它匹配的長度依然是一個字
元,要設定匹配的長度,請加"*","+","-","?",如:
[0-9]:匹配數字,相等於%d
[0-9a-z]:匹配數字和英文字母小寫。
[-a-z]:匹配"-"和英文字母小寫。
[%d%a]:匹配英數字,等同%w。
[%d\n]:匹配數字和換行。
^:前綴,為匹配字元加上開頭限定的條件。但如在[]裡的開頭,就變成反集合。如:
[\n]匹配換行字元,[^\n]匹配換行字元以外的字元。
$:後綴,為匹配字元加上末尾限定的條件,但要注意看不到的字元,如'\n','\r'可能會影
響結果。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
string.gsub(s,pattern,repl [, n])
功能:將目標字串中和模式字串匹配的部分全部取代後回傳。
說明:有四個參數:
s:母體
pattern:匹配條件
repl:新的內容
n:取代次數。
它會回傳兩個值,一個是取代後的結果,一個是取代次數。
同樣支援表達式匹配。
範例:a = '你的身上(wealth)帶有 6667570 影特幣,銀行存款(balance)有63908926 影特
幣。'
i,j = string.gsub(a,'%d+ %S%S%S%S%S%S','30塊新台幣')
print (i)
print ('替換次數:'..j)
得結果:
你的身上(wealth)帶有 30塊新台幣,銀行存款(balance)有30塊新台幣。
替換次數:2
i,j = string.gsub(a,'%d+ %S%S%S%S%S%S','30塊新台幣')
print (i)
print ('替換次數:'..j)
得結果:'
你的身上(wealth)帶有 30塊新台幣,銀行存款(balance)有63908926 影特幣。
替換次數:1
print(string.gsub("hello Lua","(.)(.)","%2%1"))
將相鄰的兩個字符對調,輸出為ehll ouLa
這個是在別旳地方看來的,不過以MushClient的別名輸出,結果不太一樣,但在命令
列輸出是正確的。
print(string.gsub("hello Lua!","%a","%0-%0"))
輸出為h-he-el-ll-lo-o L-Lu-ua-a!
string.gmatch (s, pattern)
功能:回傳所有目標字串中和模式字串匹配的部分。
說明:和string.sub/gsub不同(功能截然不同),加上g,基本功能也是一樣,不過
string.gmatch會尋找匹配部份,從頭找到尾,它只有兩個參數,直接用print輸出,
只會得到一個table表的ID值。必須用迴圈才會取出內容。
範例:s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do
print(w)
end
找出所有單字並輸出。如果gmatch的迴圈老是寫失敗,找不到問題,直接用上例,這
個Lua說明手冊的範例去修改。網路上有幾個例子的教學,不過在Mushclient都無法
執行,這個是目前找到成功的。
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
把指定格式的字串取出,寫到一個表中。因為匹配的捕獲有兩個,所以迴圈的變數增
加為兩個。
string.format (formatstring, ···)
功能:將字串格式化後再回傳。
說明:這個相對其它字串函數,使用方式比較複雜,建議是一邊改一邊輸出檢查結果。它有
兩個參數:
formatstring:顯示的格式。
string:字串內容。
設定格式的轉義碼也是用%,要注意大小寫,內容有:
┌───┬─────────────────────────────────┐
│%c │接受一個數字,並將其轉化為ASCII碼表中對應的字元 │
│%d,%i │接受一個數字並將其轉化為有符號的整數格式,如果數字是為16進位的格 │
│ │式(如0xf),會被轉成10進位的數字,但起始值是以0起算的。 │
│%o │接受一個數字並將其轉化為八進制數格式 │
│%u │接受一個數字並將其轉化為無符號整數格式 │
│%x │接受一個數字並將其轉化為十六進制數格式, 使用小寫字母 │
│%X │接受一個數字並將其轉化為十六進制數格式, 使用大寫字母 │
│%e │接受一個數字並將其轉化為科學記數法格式, 使用小寫字母e │
│%E │接受一個數字並將其轉化為科學記數法格式, 使用大寫字母E │
│%f │接受一個數字並將其轉化為浮點數格式 │
│%g(%G)│接受一個數字並將其轉化為%e(%E, 對應%G)及%f中較短的一種格式 │
│%q │接受一個字符串並將其轉化為可安全被Lua編譯器讀入的格式 │
│%s │接受一個字符串並按照給定的參數格式化該字符串 │
└───┴─────────────────────────────────┘
在%和匹配字元中間,依規則增加格式化的條件:
%[+-(一般是靠左或靠右)][補位字元,幾乎只能用0][總寬度].[取幾個位元][字符]
如:%+06.3s << 靠右,總寬度6位,目標字串只取3個字元長度。在%和s外面則被視
為普通字串。
範例:string.format("%%c: %c", 83) 輸出S
string.format("%+d", 17.0) 輸出+17
string.format("%05d", 17) 輸出00017
string.format("%o", 17) 輸出21
string.format("%u", 3.14) 輸出3
string.format("%x", 13) 輸出d
string.format("%X", 13) 輸出D
string.format("%e", 1000) 輸出1.000000e+03
string.format("%E", 1000) 輸出1.000000E+03
string.format("%6.3f", 13) 輸出13.000
string.format("%q", "One\nTwo") 輸出"One
Two"
string.format("%s", "monkey") 輸出monkey
string.format("%10s", "monkey") 輸出 monkey
string.format("%5.3s", "monkey") 輸出 mon
string.reverse (s)
功能:將字串的排列順序倒過來並輸出。
說明:如上。
範例:免了。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.196.45
※ 編輯: hmml 來自: 220.132.196.45 (06/16 03:13)
※ 編輯: hmml 來自: 220.132.196.45 (06/16 13:03)
... <看更多>