1. 程式人生 > >Lua string用法

Lua string用法



1.基礎字串函式

string.len(str)  -- 獲得字串的長度
string.rep(str, n) -- 返回字串重複n次的結果
string.lower(str) -- 小寫
string.upper(str) -- 大寫
string.char(i, i + 1, i + 2) — 整數轉換字元,返回一個由這些字元連線而成的字串
string.byte(s, i) —- 返回字串s中第i個字元的內部數值表示
string.reverse(str) —-  返回一個字串的倒序排列
string.sub(s, i, j)  —- 從字串s中提取第i個到第j個字元
  (索引1開始,負數表示從尾部開始計數,第三個引數預設-1 代表字串的最後一個字元)
  (重點:在Lua中,字串和其它語言的一樣,是不可變的,以上的操作,都會返回一個新的值,但並不會修改原來的字串。)
string.format()
http://blog.csdn.net/hello_crayon/article/details/50667927

print(string.char(97)) -- a
local i = 98
print(string.char(i, i + 1, i + 2)) -- bcd


print(string.byte("abc")) -- 97  第二個引數預設,返回第一個字元的內部數值表示
print(string.byte("abc", 2, 3)) -- 98 99
print(string.byte("abc", -1)) -- 99


—要想重新轉換成字串的話
t = {s.byte(1, -1}
string.char(unpack(t))


2.模式匹配函式

find:字串查詢,返回起始和結束位置
match:返回匹配字串
gsub:全域性字串替換,將s中所有符合pattern的字串替換為reps,返回結果串+匹配數
gfind:全域性字串查詢,返回一個迭代器,迭代器每執行一次,返回下一個匹配串
gmatch:返回查詢到字串的迭代器



string.find(str, pattern, init, plain) 

將查詢目標模板在給定字串中出現的位置,找到返回起始和結束位置,沒找到返回nil。
 s: 源字串
 pattern: 待搜尋模式串
 init: 可選, 起始位置
 plain: 我沒用過
 
 ① 子串匹配:
print(string.find("haha", 'ah') )  ----- 輸出 2 3  


—- 用一個字串中所有的新行構造一個表
local t = {}      -- 存放回車符的位置
local i = 0
while true do
    i = string.find(s, "\n", i+1)  -- 查詢下一行
    if i == nil then break end
    table.insert(t, i)
end


 ② 模式匹配:
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999


pair = " name = Anna "
print(string.find(pair, "(%a+)%s*=%s*(%a+)") ---- 輸出 2 12 name Anna 


解釋:
 如果 find 的第二個引數使用了某種匹配模式, 並且模式串裡面帶括號。 那麼表示會“捕捉”括號括起來的模式匹配到的字串。 捕捉, 當然會把他們作為返回值。這裡捕捉了兩下, 所以 find 多返回了兩個值


string.match(str, pattern, init)

只尋找源字串str中的第一個配對. 引數init可選, 指定搜尋過程的起點, 預設為1.
在成功配對時, 函式將返回配對錶達式中的所有捕獲結果; 如果沒有設定捕獲標記, 則返回整個配對字串. 當沒有成功的配對時, 返回nil.
print(string.match("hello,world","hello")) --> hello


date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d)   --> 2014/10/6


string.gsub(s, pattern, reps,n)

將s中所有符合pattern的字串替換為reps,返回結果串+匹配數
第1個引數:源字串
第2個引數:待替換之模式串
第3個引數:替換為reps。
可以是string,
也可以是函式,用捕獲的內容作為引數呼叫該函式,將返回的內容作為替換字串,
也可以是table,用捕獲的內容為key去取table的值來作為替換字串,如果不存在,就不做替換。
第四個引數:可選,當它被指定時, string.gsub()函式只對源字串中的前n個成功配對的成員進行操作.
print(string.gsub("hello, world", "o", "a"))    <== hella, warld        2

print(string.gsub("all lii", "l", "x", 2))    <==  axx lii

_, count = string.gsub(str, " ", " ")  —- 計算一個字串中空格出現的次數

print(string.gsub("hello Lua", "(%w+)%s*(%w+)", "%2 %1"))  <== Lua hello 1

string.gsub("hello world", "%w+", print)  <== hello world 2

s, n = string.gsub("hello world", "l+", function(s) return "xxx" end)
print(s, n) <== hexxxo worxxxd 2


lookupTable = {["hello"] = "hola", ["world"] = "mundo"}
print(string.gsub("hello world", "(%w+)", lookupTable))   <== hola mundo 2


string.gfind(s, pattern)

返回一個迭代器,迭代器每執行一次,返回下一個匹配串
iter = string.gfind("a=b c=d", "[^%s+]=[^%s+]")
print(iter()) <== a=b
print(iter()) <== c=d

—- 通常用於泛性for迴圈,下面的例子結果同上:
for s in string.gfind("a=b c=d", "[^%s+]=[^%s+]") do
print(s)
end


string.gmatch

函式將返回一個迭代器,用於迭代所有出現在給定字串中的匹配字串。
local s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
	print(w)
end

— 這裡是一個捕獲並將配對字元分別存到不同變數的例子:

t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
 t[k]=v
end
for k, v in pairs(t) do
 print(k, v)
end


==================================================================

模式匹配

與其他指令碼語言不同的是,Lua並不使用POSIX規範的正則表示式(也寫作regexp)來進行模式匹配。

Lua支援的所有字元類

. 任意字元
%s 空白符
%p 標點字元
%c 控制字元,例如\n
%d 數字
%x 十六進位制數字
%z 代表0的字元
%a 字母
%l 小寫字母
%u 大寫字母
%w 字母和數字
上面字元類的大寫形式表示小寫所代表的集合的補集。例如,'%A'非字母的字元

模式串中的特殊字元:

( ) . % + - * ? [ ^ $
'%' 用作特殊字元的轉義字元
'%.' 匹配點;
'%%' 匹配字元 '%'。

轉義字元 '%'不僅可以用來轉義特殊字元,還可以用於所有的非字母的字元。當對一個字元有疑問的時候,為安全起見請使用轉義字元轉義他。

用'[]'建立字符集:

1.不同的字元類,和單字元之間用[]
'[%w_]' 匹配字母數字和下劃線
'[01]' 匹配二進位制數字
'[%[%]]'匹配一對方括號


2.要想字符集內包含字元區間,起止之間加上-
'[0-9]' ==  ’%d’
'[0-9a-fA-F]' ==  '%x' 
'[0-7]' ==  '[01234567]'


3.如果想得到該字符集的互補,前面加上^
'[^0-7]' 匹配任何不是八進位制數字的字元;
'[^\n]' 匹配任何非換行符戶的字元。
'[^%s]' == '%S'

模式修飾符:

+ 匹配前一字元1次或多次
* 匹配前一字元0次或多次;最長匹配
- 匹配前一字元0次或多次;最短匹配
? 匹配前一字元0次或1次
^ 匹配字串開頭
$ 匹配字串結尾

捕獲:用()將要捕獲的部分包圍起來:

pair = "name = Anna"
firstidx, lastidx, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) <== name Anna

我們也可以將捕獲用於模式串自身,"([\"'])(.-)%1",這裡的%1表示匹配第一個捕獲的一份拷貝。

拷貝捕獲(%1-%9):

s = "abc \"it\'s a cat\""
_,_,_,q = string.find(s, "([\"'])(.-)%1"))
print(q) <== it's a cat 如果%d代表第幾個捕獲的拷貝。


-— gsub也可以用拷貝捕獲技巧
print(string.gsub("hello, world", "(o)", "%1-%1")) <== hello-o, wo-orld    2
print(string.gsub("hello Lua", "(.)(.)", "%2%1")) <== ehll ouLa           4
function trim (s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")) end <== 注意匹配數用括號丟棄

例子:

檢查字串s是否以數字開頭 if string.find(s, "^%d") then ...
檢查字串s是否是一個整數  if string.find(s, "^[+-]?%d+$") then ...


'%b' 用來匹配對稱的字元。常寫為 '%bxy' ,x和y是任意兩個不同的字元;x作為匹配的開始,y作為匹配的結束。
比如,'%b()' 匹配以 '(' 開始,以 ')' 結束的字串:

print(string.gsub("a (enclosed (in) parentheses) line", "%b()", ""))
--> a line


常用的這種模式有:'%b()' ,'%b[]','%b%{%}' 和 '%b<>'。你也可以使用任何字元作為分隔符。








相關推薦

Lua string用法

1.基礎字串函式 string.len(str)  -- 獲得字串的長度 string.rep(str, n) -- 返回字串重複n次的結果 string.lower(str) -- 小寫 string.upper(str) -- 大寫 string.char(i, i +

Lua string.sub用法

string.sub(s,i,j)函式擷取字串s的從第i個字元到第j個字元之間的串.Lua中,字串的第一個字元索引從1開始.你也可以使用負索引,負索引從字串的結尾向前計數:-1指向最後一個字元,-2指向倒數第二個,以此類推.

Lua string.gsub (s, pattern, repl [, n])

表示 user 參數 style ron return 類型 ble 模式 lua的string函數導出在string module中。在lua5.1,同時也作為string類型的成員方法,因此,我們既可以寫成string.gsub (s,……)

String用法-1

java string 去掉空格關鍵字:關鍵字 trim();str1是一段字符串。查找字符所在的位置:關鍵字 indexOf("c")str1.indexOf("c")表示在string 字符串裏找c。若是沒有返回-1;str1.indexOf("c

lua string

abcd 空格 reverse 數值 cal 忽略 個數 補齊 nbsp 相關的方法如下圖所示: len string.len(s) 返回字符串s的長度 string.len(‘abcd‘)    --> 4 rep string.rep(s,n) 返

STL-string用法總結

(string-c++官網:http://www.cplusplus.com/reference/string/string/?kw=string) stirng有什麼使用價值呢? 字元陣列是C中非常常用而又麻煩的一個東西:     如果分配的初始空間不夠,會造成字元

C++ string 用法詳解--原作者是Nicolai M.Josuttis

任何人對本文進行引用都要標明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 語言是個十分優秀的語言,但優秀並不表

c++中的string用法總結

標準C++中的string類的用法總結 轉自;http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC程式設計的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CStri

標準庫型別String用法總結(1)

標頭檔案及名稱空間 #include<string> using std::string 定義及初始化string物件 string s1; //預設初始化,s1是一個空串 string s2(s1);//s2是s1的副本 string s2=s1;//等價於s2(

C++ STL string 用法詳解

一、string的初始化 首先,為了在程式中使用string型別,必須包含標頭檔案 <string>。如下: #include <string> 注意這裡不是string.h,string.h是C字串標頭檔案。 string類是一個模板類

C++ string用法

// str1.cpp -- introducing the string class #include <iostream> #include <string> // using string constructors int main() { using names

lua next 用法

在專案的指令碼lua中經常有這樣的需求, 1、local a = {} 2、對a進行處理 3、對a是否為空表進行判斷 關於對a是否為空表的判斷,我發現有些程式碼如此做: if a == {} then 這樣的結果就是a == {}永遠返回false,是一個邏輯

JAVA中String 用法

1,獲取 1.1:字串中包含的字元數,也就是字串的長度。 int length():獲取長度 1.2:根據位置獲取位置上某個字元。 char charAt(int index) 1.3:根據字元獲取該字元在字串中的位置。 int i

演算法筆記-6.3 string用法

#include<stdio.h> #include<iostream> #include<string>//!!!!!!注意不是string.h using namespace std; int main(){ string str; int k; cin

Lua 函式用法探究

 在 中有涉及到函式的用法,但只是普通的應用,並沒有深成次的研究一下,介於函式用的還是比較多的就專門做個專題研究一下~   一、函式、變數的用法              函式的定義用關鍵字function 。然後加函式名和變數。注意後面沒有do。最後以end結束。

String用法詳解(equal原始碼 ==和equal的解釋、字面賦值和new賦值效率、重寫了hashcode的方法解釋)

String  a = “abc”;//在字串池中找abc,如果有,就直接返回地址,如果沒有就加值abc然後再返回地址(此方式的值是存放在字串池中) String  b =  “abc”; String  c  =   new String("abc");//在字串池中找a

lua table 用法

在corona sdk裡,是用lua去做所有事情的。因此,瞭解lua的特性和API非常重要。 什麼是Table? 如果你有其他語言的開發經驗,你應該知道2種資料型別,那就是陣列和集合,在lua中,table就是陣列和集合的混合物(這也是為什麼table如此強大的原因)。 如果corona sdk是你第一次開始

C++ string 用法詳解

任何人對本文進行引用都要標明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 語言是個十分優秀的語言,但

String用法詳解

string類宣告string類本不是STL的容器,但是它與STL容器有著很多相似的操作,因此,把string放在這裡一起進行介紹。 之所以拋棄char*的字串而選用C++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為一個

string用法

相當於c語言中的字元陣列。 string 提供了很多建構函式,可以以多種方式來初始化string字串 string str1= "abcdef"; string str2 (str1,3) ; // = def string str3 (str1,3 2) ;