44. Lua string 字符串库

string 字符串库

  1. len(s) 长度
  2. rep(s,n) sn次 print( string.rep( "" , 5 ) ) --> *****
  3. lower(s) 将 s 字符串中的大写字母转为 小写
  4. upper(s) 将 s 字符串中的小写字母转为 大写
  5. sub(s,i,j) 复制 s 字符串 从第i位 到 第j位结束
  6. char(n) 将 acs码转化为字符 print( string.char( 97 , 98 , 99 ) ) --> abc
  7. byte(s,i,j) 将 s(字符串)中从 第i个字符到第j个 转为acs码
  • print( string.byte( "sadfsadfsad" ) ) --> 115
  • print( string.byte( "sadfsadfsad" , 1 ) ) --> 115
  • print( string.byte( "sadfsadfsad" , 1 , 3 ) ) --> 115 97 100
  1. format -- c语言 printf("%s",v)
  • print( string.format( "pi=%.4f" , math.pi ) ) --> pi=3.1416

示例代码

print( string.rep( "*" , 5 ) )
print( string.lower( "KLJKiuiouioKLJK") )

a = { "ax" , "Dy" , "pk" , "bJlLk" }
table.sort(
    a ,
    function(a,b)
        return string.lower(a) < string.lower(b)
    end
)
print( table.concat(a,",") )

s = "[asdfjsalfksajflsa]"
print( string.sub( s , 2 , #s-1 ) )
print( string.char( 97 , 98 , 99 ) )
print( string.byte( "sadfsadfsad"  ) )
print( string.byte( "sadfsadfsad" , 1 ) )
print( string.byte( "sadfsadfsad" , 1 , 3 ) )

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

d = 5 ; m = 11 ; y = 1990

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

tag , title = "h1" , "a titile"
print(string.format("<%s>%s<%s>",tag,title,tag))  --> <h1>a titile<h1>
  1. 模式匹配函数
  • string.find
  • string.match
  • string.gsub
  • string.gmatch

示例代码 :

s = "hello world"
print( string.find(s,"hello") ) --> 1   5
print( string.find(s,"world") ) --> 7   11
print( string.find(s,"l" ) )  --> 3 3
print( string.find(s,"l",4 ) )  --> 4   4
print( string.find(s,"lasfsaf") )  --> nil

local t = {}  -- 存储索引的table
local i = 0
while true do  -- 将 s 中所有的换行符位置保存在t中
    i = string.find(s,"\n",i+1)  -- 查找下一个换行符
    if i == nil then break end
    t[#t+1] = 1
end

-----------------------

print( string.match("hello world" ,"hello") )  --> hello
date = " today is 17/7/1990"
print( string.match(date,"%d+/%d+/%d+") )  --> 17/7/1990  类似正则

------------------------

print( string.gsub( "Lua is cute" , "cute" , "greate" ) )  --> Lua is greate    1

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

------------------------

string.gmatch
words = {}  -- 将 s 的所有字母存放到 words 中
for w in string.gmatch(s,"%a+") do        -- %a  表示一个字母
    words[#words + 1 ] = w
end

注意 :

    模式:
        字符分类:
            %a  字母                      %A(表示所有非字母的字符)    (大写是小写的补集)
            %c  控制字符                  %C(表示非控制字符)
            %d  数字零到九
            %l  小写字母
            %p  标点符号
            %s  空白字符
            %u  大写字母
            %w  字母和数字
            %x  十六进制数字
            %z  内部表示为0的字符
        魔法字符: ( ) . % + - * ? ^ $
            %.  匹配一个 .
            %%  匹配一个 %
            ...
        字符集:
            [%w_] 同时匹配 字母数字和下划线
            nvow = select( 2 , string.gsub( text , "[AEOUaeiou]" ,"" ) )  -- 文本text中 元音字符的数量
            [0-9] %d
            ^ 表示 非 [^0-7] 表示所有非八进制数字的字符
        修饰符:
            + 一个以上 %a+  print(string.gsub("one, and two ; and three ", "%a+","word"))  -- 把所有单词变成 word
            * 0个以上
            - 和*一样 , 但会匹配最短的子串  "[_%a][_%w]-"
            ? 匹配一个 [-+]? + 或 -
            ^ string.find(s,"^%d")  匹配 以数字开头的字符串
            $ string.find(s,"%d$")  匹配 以数字结束的字符串

常用方法

  1. 多个捕获,需要加上小括号 %s表示空格
pair = "name=Anna"
key , value = string.match(pair,"(%a+)%s*=%s*(%a+)")  -- 可多个捕获,需要加上小括号 %s表示空格
print(key , value)

date = "Today is 17/7/1990"
d , m , y = string.match(date,"(%d+)/(%d+)/(%d+)")
print(d,m,y)  -->  17 7 1990
  1. %加数字表示捕获序号
s = [[then he said:"it's all right"!]]
q,quotedPart = string.match(s,"([\"'])(.-)%1")
print(q,quotedPart)

p = "%[(=*)%[(.-)%]%1%]"
s = "a=[[[ something]]]==]]=];print(a)"
print( string.match(s,p) )

local s = "abcdefg"
print(string.gsub(s,"(%w)(%w)(%w)","%3%2%1")) --cbafedg  %加数字表示捕获序号

print(string.gsub("hello lua ! " , "%a" , "%O-%O" ))

print(string.gsub("hello lua","(.)(.)","%2%1"))

function trim(s)
  return (string.gsub(s,"^%s*(.-)%s*$","%1"))
end
  1. 去除字符串两端的空格 trim(s)
s = "     safdsaf          "
print( trim(s) .. "aa" )  
  1. $varname varname 利用属性值修改字符串

function expand(s)
  return ( string.gsub(s,"$(%w+)",_G) )
end

name = "Lua"
status1 = "great"
print( expand( "$name is $status , isn't it ? " ) )

function expand(s)
  return ( string.gsub(s,"$(%w+)",function(n)
      return tostring(_G[n])
  end
  ) )
end
status1 = "great"
print( expand( "$name is $status , isn't it ? " ) )
  1. "()" 空捕获应用
  print( string.match("hello" , "()ll()" ) )  --> 3   5  分别是 e 和 o 的位置

URL编码 \ tab扩展

  1. URL编码解码
function unescape(s)
  s = string.gsub( s , "+" , " " )
  s = string.gsub( s , "%%(%x%x)" , function(h)
          return string.char( tonumber( h , 16 ) )  -- tonumber( h , 16 ) 把16进制的h 转为 10进制的数字
      end
  )
  return s
end

s = "a%2Bb+%3D+c"
print( unescape(s) )

cgi = { key1 = "1" , key2 = "2" , key3 = "3" }
function decode(s)
  for name , value in string.gmatch( s , "([^&=]+)=([^&=]+)") do
      name = unescape(name)
      value = unescape(value)
      cgi[name] = value
  end
end
print(  decode(cgi) )

function escape(s)
  s = string.gsub( s , "[&=+%%%c]" , function(c)
          return string.format("%%%02X",string.byte(c))
      end)
      s = string.gsub( s , " " , "+" )
      return s
end

function encode()
  local b = {}
  for k , v in pairs(t) do
      b[#b+1] = ( escape(k) .. "=" .. escape(v) )

  end
  return table.concat(b,"&")
end

t = { name = "al" , quer = "a+b=c" , q = "yes or no" }

print( encode(t) )
  1. tab 扩展
-- 需求 : 将字符串中的 制表符 转为 tab 个 空格 (默认为8个)
function expandTabs( s , tab )
  tab = tab or 8  -- 制表符的大小默认为8
  local corr = 0
  s = string.gsub( s , "()\t" , function(p)
      local sp = tab - (p-1+corr)%tab
      corr = corr - 1 + sp
      return string.rep(" ", sp)
  end)
  return s
end

s = "This is a    book."  -- this 和 is 之间 \ a 和 book 之间  有制表符
print( expandTabs(s) )

小技巧

  test = [[char s[] = "a/*here";/*a tricky string */]]
  -- 将 c 语言代码中的 注释代码 改为 <COMMENT>
  print( string.gsub(test,"/%*.-%*/" , "<COMMENT>") )  --> char s[] = "a<COMMENT>   1  理想是 char s[] = "a/*here";<COMMENT>

  -- "(.-)%$"   -- (.-)匹配一个任意字符  -- 时间复杂度 n^2  n为字符串长度
  -- "^(.-)%$"  -- 时间复杂度 n

  -- 小心空模式的使用
  -- "%a*"
  i , j = string.find(";$% **#$hello13" , "%a*")
  print( i , j )  --> 1 0
  -- "-"   ".*"   "[^\n]"
  pattern = string.rep("[^\n]" , 70 ) .. "[^\n]*"
  -- print( pattern )

  -- x "[xX]"
  function nocase(s)
    s = string.gsub( s , "%a" , function(c)
        return "[" .. string.lower(c) .. string.upper(c) .. "]"
    end)
    return s
  end

  print( nocase("Hi there!") )  --> [hH][iI] [tT][hH][eE][rR][eE]!


  -- 对字符串进行预处理
  s = [[follows a typical string:"This is \"great\"!.]]   -- "\x" \ddd

  function code(s)
    return (string.gsub(s,"\\(.)",function(x)
        return string.format("\\%03d",string.byte(x))
    end))
  end

  function decode(s)
    return (string.gsub(s,"\\(%d%d%d)" , function(d)
        return "\\" .. string.char(d)
    end))
  end

  s = code( s )
  print(s)
  s = string.gsub( s , '".-"' , string.upper )
  print(s)
  s = decode(s)
  print(s)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容