Lua字符串可以使用以下三种方式表示:

  • 单引号间的一串字符。

  • 双引号间的一串字符。

  • [[和]]间的一串字符。

    string = [["Lua"]]
    print("字符串 是",string)
    --字符串 是 "Lua"

Lua 提供很多内建方法支持字符串的操作:

  1. string.upper(argument):

    -->字符串全部转为大写字母

  2. string.lower(argument):

    -->字符串全部转为大写字母

  3. string.gsub(mainString,findString,replaceString,num)

    -->在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),返回的值是value+替换的length,如:

string.gsub("aaaa","a","b",3);
--bbba 3

PS: gsub有一个重要的功能就是透过模式匹配过滤或者返回你想去除的字串,模式介绍参考下面拓展部分

--实例1  对字符串中的每一个字母进行复制,并用连字符将复制的字母和原字母连接
p,_= string.gsub("hello Lua!", "(%a)", "%1-%1")
print(p)
--h-he-el-ll-lo-o L-Lu-ua-a! --实例2 互换相邻的字符
p,_=string.gsub("hello Lua", "(.)(.)", "%2%1")
print(p)
--ehll ouLa
--替换掉字符里的字母a和尖括号
local text = string.gsub(text, '[a<>]', '')
--替换掉特殊的符号
local text = string.gsub(text, "%[", "")
local text = string.gsub(text, "%]", "")
--也可以这样
local text = string.gsub(text, "[%[%]]", "")
  1. string.find (s, pattern [, init [, plain]])**

-->在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置,不存在则返回 nil,其中init 代表起始位置。

print(string.find("test", 'es'))
----输出 2 3

​ 如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)

_, q=string.find("test", 'es')
print(q) ---- 输出 3

​ 如果我们只想要 string.find 返回的第1个值,下划线代表当前return 变量, 对find进行赋值再打印即可

q,_ = string.find("test", 'es')
print(q) ----输出2

拓展-->字符串模式匹配

pair = "name = Anna"
_, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
print(key, value)
-- 输出 name Anna

如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 返回了两个值

Lua支持的字符类有:

. 任意字符

%s 空白符

%p 标点

%c 控制字符

%d 数字

%x 十六进制数

%z 代表0的字符

%a 字母

%l 小写字母

%u 大写字母

%w 字母数字

字符类的大写形式代表相应集合的补集, 比如:%A 表示除了字母以外的字符集

另外还有模式修饰符,* + - 三个,作为通配符分别表示:

*: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串

--先尽可能长的把本次匹配模式走完,再继续一下一个模式

+: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串

--匹配前一字符1次或者多次

-: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串

--本次匹配模式每走一步,就确认一下一个模式能否进入

? 匹配前一字符0次或1次

^ 匹配字符串开头

$ 匹配字符串结尾

模式串中的特殊字符

( ) . % + - * ? [ ^ $

'%' 用作特殊字符的转义字符

'%.' 匹配点;

'%%' 匹配字符 '%'。

转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。

用'[]'创建字符集

'[%w_]' 匹配字母数字和下划线

'[01]' 匹配二进制数字

'[%[%]]'匹配一对方括号

在'[]'中使用连字符'-'

'%d' 表示 '[0-9]';

'%x' 表示 '[0-9a-fA-F]'

'[0-7]' 表示 '[01234567]'

在'[]'开始处使用 '^' 表示其补集:

'[0-7]' 匹配任何不是八进制数字的字符;

'[^\n]' 匹配任何非换行符户的字符。

'[^%s]' == '%S'

于是, "(%a+)%s=%s(%a+)" 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 "name = Anna"。 所以输出位置为 2 12.

因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词

另外, lua 使用 %1-%9 表示拷贝捕获

捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个捕获

s="abc \"it's a cat\""
_,_,_,q=string.find(s, "([\"'])(.-)%1")
print(q) -----输出: it's a cat

首先, ["'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.

'-' 与 '*' 到底有什么不同呢? 在上面, "(["'])(.*)%1" 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:

print( ("\"hello\" \"hello\""):find('"(.+)"') )  ----输出 1 15 hello" "hello
print( ("\"hello\" \"hello\""):find('"(.-)"') ) ----输出 1 7 hello
  • * 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello" "hello)
  • - 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)

    我们可以用string.find 搭配匹配字符获得我们想要的字串

date = "17/7/1990"
_, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y) --> 17 7 1990
  1. string.reverse(arg)

    —>字符串反转

    string.reverse("Lua")
    --auL
  2. string.format(...)

    返回一个类似printf的格式化字符串

string.format("the value is:%d",4)
--the value is:4
  1. string.char(arg) 和 string.byte(arg[,int])

    char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
  1. string.len(arg)

    计算字符串长度

string.len("abc")
--3
  1. string.rep(string, n)

    回字符串string的n个拷贝

string.rep("abcd",2)
abcdabcd
  1. string.gmatch(str, pattern)

return一个迭代器函数,每一次调用这个函数,会返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。

for word in string.gmatch("Hello Lua user", "%a+")
do
print(word)
end
Hello
Lua
user
  1. string.match(str, pattern, init)

string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。

在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。

local path = "c:/home/test/1.txt"
local name = string.match(path, ".+/(.+)")
print("name:", name)
--1.txt
 string.match("I have 2 questions for you.", "%d+ %a+")
--2 questions string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
--2, "questions"
  1. string.sub(str,i[,j])

用于字符串截取,返回截取长度的字符串(区间为闭)

a = "abc1test 123"
print (string.sub(a,2))
--bc1test 123
print (string.sub(a,2,4))
--bc1

Lua 学习之基础篇三<Lua 字符串操作>的更多相关文章

  1. Lua 学习之基础篇七<Lua Module,Package介绍>

    Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...

  2. Lua 学习之基础篇四<Lua table(表)>

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  3. Lua 学习之基础篇十<Lua 常见的语法规则>

    下面讲一些lua 常见的用法和规则,可以为学习理解lua带来帮助,最后附上的部分是lua的基本操作,基本包含所有常用语法语句. 1. if判断 lua把 nil 和false 视为"假&qu ...

  4. Lua 学习之基础篇一<Lua 运算符>

    引言 由于刚接触lua,个人觉得接触一门新语言,就要一定要对基础的部分做一个快速了解. 于是参考网上相关资料吸收并整理下来作为笔记,模糊的时候用来回顾一下. 这些部分基本都是经过自己手动测试梳理过,没 ...

  5. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  6. Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>

    讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table val ...

  7. Lua 学习之基础篇六<Lua IO 库>

    引言 I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. ...

  8. Lua 学习之基础篇五<Lua OS 库>

    lua os库提供了简单的跟操作系统有关的功能 1.os.clock() 返回程序所运行使用的时间 local nowTime = os.clock() print("now time is ...

  9. Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>

    引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...

随机推荐

  1. sql语句中,取得schema中的所有表信息及表的定义结构

    postgressql下'検索スキーマの中で.全てテーブルselect tablename from pg_tables where schemaname='test' mysql下'検索スキーマの中 ...

  2. [转载]桥接与NAT

    NAT相当于是局域网中的局域网,把192.168.21.1当作外网ip,重新划分了一个网关(192.168.33.x) 网桥只是把网络桥接起来,还是原来的网关(192.168.21.x),虚拟机相当于 ...

  3. linux系统下,在用户空间应用程序中模拟发送系统键盘事件

    Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件. 如果想模拟键盘事件,但是系统没有键盘设备该如何是好? 基于输入子系统实现的 input 可以方便的在用户空间模拟鼠标和键盘事件. ...

  4. oracle调用函数的方式

    --方法1.PLSQL代码块 SQL> set serveroutput onSQL> declare 2 v_sal emp_pl.sal%type; 3 begin 4 v_sal : ...

  5. Python 实现把两个排好序的的列表合并成一个排序列表

    列表是升序的 # -*- coding: utf-8 -*- # 合并两个排序的数组 def merge_list(a, b): if not a: return b if not b: return ...

  6. javaIO -- 流的体系设计思路、基础分类

    一.流 1. 流的含义 在程序设计中,流是对于数据流动传输的一种抽象描述任何有能力产出数据的数据源,或者有能力接受数据的接收端对象都是一个流. 2. 流的源和目的 数据可能从本地文件读取,或者写入,  ...

  7. (四)Resquest 知识点总结 (来自那些年的笔记)

    目录 URL和URI的区别 获取URL.URI 什么是HttpServletResquest 获取请求头中字段的内容 获取请求信息的数据 将客户机的请求变为一个流返回 常用的方法 request乱码问 ...

  8. 一个好隐蔽的C/C++代码bug

    来自:微博@ruanyf, 一本书上说,下面的 C 语言代码可能会产生无限循环.看了半天,才意识到 Bug 在哪里. 完美解答: 数组下标越界.数组a总共有10个值,a[0]~a[9].for循环里面 ...

  9. linux下安装lnmp集成环境

    linux下安装lnmp集成环境 教程地址:https://www.cnblogs.com/peteremperor/p/6750204.html 必须要用root用户,否则权限不够无法安装 安装最新 ...

  10. Centos7.3安装jenkins

    安装jenkins         下载地址: https://jenkins.io/download/最新版本         将Jenkins上传到tomcat的webapp目录          ...