--****************Lua的string库函数******************

--1.string.byte
--string.byte (s [, i [, j]])
--取出字符串中的字节.i是起始位置,j是结束位置.
--解析协议的时候经常用来将字符串中的某几个字节取出,然后重新组装为一个多字节的数字. --2.string.char
--string.char (···)
--接受若干数字,组成一个字符串,字符串的长度为参数个数.字符串内部的字节和数字对应.
--解析协议的时候,经常用来将一个多字节的数字按字节存入字符串. --3.string.dump
--string.dump (function)
--将一个lua函数作为一个字符串返回.可以用load函数加载这个字符串,返回该函数的拷贝.
--4.string.find
--string.find (s, pattern [, init [, plain]])
--在字符串s中查找符合pattern的子串,如果找到了返回子串的开始位置和结束位置,否则返回nil
--init参数为查找的起始位置,可以为负数.
--plain参数为true的话会关闭模式匹配,只进行纯字符串匹配.
--更多的模式匹配规则会在下面详细记录.
--5.string.format
--string.format (formatstring, ···)
--类似c语言的sprintf函数.返回一个格式化的字符串.区别是string.format不支持 *, h, L, l, n, p 这些模式. 额外支持一个q模式.
--q模式会转义字符串参数中的双引号.以便可以将字符串重新读回lua.
--模式 A,a (when available), E, e, f, G, g 都对应一个数字参数.
--模式 c, d, i, o, u, X, x 也对应一个数字参数, 但是数字所占字节数受限于底层c实现.
--模式 o, u, X, x 对应的参数不能为负数.
--模式 q 对应一个字符串.
--模式 s 对应一个不含 \000 的字符串. 如果对应的不是一个字符串,则按照tostring来.
--6.string.gmatch
--string.gmatch (s, pattern)
--匹配字符串s中的pattern , 返回一个迭代器函数, 每次调用该迭代器函数,返回下一个子串.
--pattern中捕获( 使用小括号() )了几个内容,则每次返回几个值. 如果没有捕获任何值,则返回整个子串. --7.string.gsub
--string.gsub (s, pattern, repl [, n])
--第一个返回值为字符串s的副本, 其中所有(或者前n个)符合模式pattern的子串都被替换为repl.
--第二个返回值为替换的次数.
--repl 可以为一个字符串,一个table 或者一个函数.
--如果repl为一个字符串.则使用这个字符串来替换.repl中,字符%是一个转义字符.出现在repl中的( %d , 其中d的范围为1-9)对应符合pattern模式的字串中捕获的值.
--%0代表整个字串. %%代表一个单独的%
--如果repl为一个table. 则每次匹配到字串的时候都会查询这个table. 使用第一个捕获的值做为key.
--如果repl为一个函数. 则每次匹配到字串的时候都会调用, 依次传入每个捕获的值.
--如果repl所对应的table或者函数返回的值为一个字符串或者数字,则使用返回值来替换.
--如果repl所对应的table或者函数返回的值为false或者nil,则不执行该字串的替换. --8.string.len
--string.len (s)
--返回字符串的长度. \000 被算进长度 . 因此字符串 "a\000bc\000" 的长度为5
--9.string.lower
--string.lower (s)
--将字符串中的大写字符转换为小写. --10.string.match
--string.match (s, pattern [, init])
--匹配字符串s中的第一个符合pattern的子串 , 如果找到了 , 返回所有捕获的值。否则返回nil
--如果没有捕获任何值,则返回整个字串.
--init参数为匹配的起始位置,可以为负数.
--11.string.rep
--string.rep (s, n [, sep])
--将n个字符串s拼起来, 重复n次 , sep是他们之间的间隔.
--12.string.reverse
--string.reverse (s)
--翻转字符串
--13.string.sub
--string.sub (s, i [, j])
--截取子串.参数i为开始位置,j为结束位置.
--i和j都可以为负数. 字符串的起始位置为1,字符串的末尾为-1.
--如果经过转换后,i小于1,i被修正为1. (例如字符串长度为3,i为-4,则实际i到了字符串起始位置之前)
--如果经过转换后,j大于字符串长度,j被修正为字符串长度.
--如果经过转换后,i大于j.则返回一个空串.
--string.sub(-5,10)  开始参数start 为负数,子串的位置从字符串的最后开始计算,--从字符串的倒数第五的位置开始,结束的位置为 从1 的位置开始到10的位置结束
-- **************lua中string的模式匹配******************* --************** 字符集合***************
-- X: X为不包含在特殊字符中的字符,属于一个普通字符. 代表字符X本身
-- .: 代表所有字符
-- %a: 代表所有字母
-- %c: 代表所有控制字符
-- %d: 代表所有数字(0-9)
-- %g: 代表除了空格外的所有可打印字符
-- %l: 代表所有小写字母
-- %p: 代表所有标点字符
-- %s: 代表所有空白字符
-- %u: 代表所有大写字母
-- %w: 代表所有包含字母或者数子的字符
-- %x: 代表所有16进制数字(0-F)
-- %X: X为所有非字母和数字的字符,代表字符X本身.可以用来转义特殊字符.所有标点字符(即使不是特殊字符)之前都可以加一个%,代表这个标点本身.
-- [set]: 代表[]之间所有字符或者模式的集合. '-'可以用来表示前后两个字符之间的范围. 例如 [%w_] 代表所有数字,字母和下划线.
-- [0-7] 代表数字0到7 . [0-7%l%-] 代表0到7的数字,所有小写字母,还有'-', 其中'-'为特殊字符,必须转义.
-- [^set]: 代表[set]的补集 --**********模式************ -- * : 匹配0个或多个字符集合中的字符. 匹配尽可能多的字符
-- + : 匹配1个或多个字符集合中的字符. 匹配尽可能多的字符
-- - : 匹配0个或多个字符集合中的字符. 匹配尽可能少的字符
-- ? : 匹配0个或1个字符集合中的字符.
-- %n: 1<=n<=9 , 对应匹配的字串中捕获的字符串.
-- %bxy: 其中x和y是两个指定的字符. 匹配一个以x开头,并以y结尾的字符串. x和y是成对匹配的.
-- %f[set]: 一种边界模式,匹配一个空字符,这个空字符的下一个字符属于集合set,它的前一个字符不属于集合set.
-- ^ : ^在一个pattern的开头匹配字符串的开始.在pattern的其他位置代表该字符本身.
-- $ : $在一个pattern的结尾匹配字符串的结尾.在pattern的其他位置代表该字符本身. --**********捕获************ -- 一个模式可以包含用括号包含起来的子模式,叫做捕获.
-- 当一个模式被匹配时,捕获的内容被储存起来,用作更多用途.
-- 捕获是按照先后来排序的. 例如在模式 "(a*(.)%w(%s*))" 中, "a*(.)%w(%s*)"是捕获的第一个子模式,"."是第二个,"%s*"是第三个.
-- 空捕获() , 捕获的是当前子串的开始位置和结束位置的下一个位置, 如果我们在字符串"flaaap"中使用"()aa()"模式来匹配, 那么捕获的值分别为3和5. print("------------pattern----------------")
print( string.match("flaaap" , "()aa()") ) --捕获匹配子串的位置.
print( string.match("fflaaap" , "^f+") ) --匹配开头的n个f.
print( string.match("flaaappp" , "p+$") ) --匹配结尾的n个p
print( string.match("xw_2" , "^[%l%d_]+$" ) ) --匹配整个字符串,这个字符串只包含小写字母,数字,下划线
print( string.match("ynEF8" , "%x+" ) ) --相当于pattern "[a-fA-F0-9]+" -- + 和 - 的区别
print( string.match("hello" , "hel+o" ) ) --都匹配两个l
print( string.match("hello" , "hel-o" ) ) --都匹配两个l
print( string.match("hello" , "hel+" ) ) --匹配两个l
print( string.match("hello" , "hel-" ) ) --匹配0个l
--在后面的模式可以匹配更多的时候, - 选择匹配更少
print( string.match("he3_llo" , "^(%l+)([3_]-)([%l_]+)$" ) ) -- he 3 _llo
print( string.match("he3_llo" , "^(%l+)([3_]+)([%l_]+)$" ) ) -- he 3_ llo

Lua的string库函数、lua中string的模式匹配的更多相关文章

  1. String.join() --Java8中String类新增方法

    序言 在看别人的代码时发现一个方法String.join(),因为之前没有见过所以比较好奇. 跟踪源码发现源码很给力,居然有用法示例,以下是源码: /** * Returns a new String ...

  2. Java中String, StringBuilder和StringBuffer

    Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...

  3. Java中String类的特殊性

    java中特殊的String类型 Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String(&q ...

  4. Lua中string.format占位符的使用

    虽然lua中字符串拼接"string.format"相对于".."消耗较大,但有时为了代码的可读性,项目中还是经常用到"string.format&q ...

  5. lua中string常用api

    local a="abcdefgbbb" string.sub(a,1,3) 字符串截取 返回截取的字符串           print(string.sub(a,1,3))   ...

  6. Android错误:can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] 已解决

    错误: can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] ...

  7. hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)

    string类中有很多好用的函数,这里介绍在string类字符串中查找字符串的函数. string类字符串中查找字符串一般可以用: 1.s.find(s1)函数,从前往后查找与目标字符串匹配的第一个位 ...

  8. 以一则LUA实例说明敏捷开发中“分离构造和使用”原则

    分离构造和使用 构造含义是功能的实现, 此功能是一个定义明确的处理过程, 开放出明确的接口给调用者使用. 则使用者可以直接调用接口进行使用, 但是使用者需要搞清楚, 那些是构造, 那些是使用. 不要再 ...

  9. Lua脚本在Redis事务中的应用实践

    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...

随机推荐

  1. http协议的再次理解

    1.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 2.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 3. ...

  2. 动态加入的HTML的自己主动渲染

    这两天在写一个用EasyUI的前台,遇到动态向Layout加入HTML内容时没有自己主动渲染的问题.查了一下网上的资料后得以解决.详细例如以下: $("#content").htm ...

  3. 很强大的shell写的俄罗斯方块

    网上看到的一个用linux的shell脚本写的俄罗斯方块. 是我至今见过写的最牛逼的shell了.共享一下. 原作者信息在脚本的凝视中有. 下载地址:点击下载 #!/bin/bash # Tetris ...

  4. K度限制MST poj 1639

    /* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...

  5. 如何更改iTunes备份地址(修改iphone ipad 备份地址) itunes文件目录修改方法 【亲测有效,附带原理说明】

    前言 C盘空间有限,但是iTunes就是那么龌龊,只能把手机备份存到C盘.那么怎么才能把备份文件存到其他分区的文件夹里面呢? 当时我想先看看度娘,看看有没有现成的! 结果 nnd!! 我看了一大堆相关 ...

  6. C# WinForm小程序(技术改变世界-cnblog)

    WinForm小程序(技术改变世界-cnblog)   需求: 1.点击按钮  更新 当前时间 2.输入 身份证,必须身份证 排序(类似银行卡那样的空格),自动生成空格排序 3.实现 必须按 第一个按 ...

  7. DataGuard总体结构

    一.DataGuard总体结构 总体目标 1.   描述计划和非计划停机的不同因数 2.   DataGuard的主要组件 3.   物理以及逻辑DataGuard的异同 4.   建立DataGua ...

  8. [Spring] Spring Boot 生态

  9. python利用有道翻译实现“语言翻译器”的功能

    import urllib.request import urllib.parse import json while True: content = input('请输入需要翻译的内容(退出输入Q) ...

  10. Djnago进阶

    详情请戳 Cookie和Session及分页设置 Ajax Django中间件 Form和ModelForm组件 auth认证组件 Django 缓存的使用 Django 信号的使用 Django a ...