一 基础了解
1)字符串用于表示'文本'
2)标准:使用'UTF-8'来存储Unicode"字符串"
3)Lua5.3提供了一个使用'UTF-8'编码的'函数库'
二 字符串
(1)字符串是不可变
特点:如果要'修改'一个字符串,则需要'重新创建'一'新'的字符串
重点:lua '自动管理'字串内存的释放字面字符串,使用'单引号'或'双引号'括起来的字符串
(2)字符串表示
单引号和双引号的唯一'区别':
1)使用双引号声明的字符串中'出现单引号时',单引号可以'不用转义'
"I'am wzj"
2)使用单引号声明的字符串中'出现双引号时',双引号'不用转义'
'"Hello Lua"'
强调: '代码风格'尽量使用'同一种风格'
(3)获取字符串的长度
'#' + '字符串'
(4)连接操作符
连接操作符:'..'
(5)Lua语言中字符串支持的C语言风格的转义字符
(6)长字符串
用一对双括号'[[]]'表示长'多行'字符串
备注:如果多行字符串的'第一个字符'是'换行符',那么换行符会'被忽略'
备注1:最后一行的'换行符'不会省略
(7)强制类型转换
说明:Lua语言在运行时提供了"数值"和"数值字符串"之间的自动转换
针对'字符串的所有算术操作符'会尝试将字符串'转换为数值'
(8)显示转换
说明:为了增强程序的'可读性',可以显示的将"数字字符串"尝试转化为'整数'
说明:指明'任意进制'的转换
tonumber("number",n)
(9)将数值转换为字符串
形式:tostring(number)
(10)注意事项
'比较操作符'不会对'操作数'进行'强制'类型转换
比较操作符号:>,'<',~=,'>=',<=
"2" < '15'为假 --> 按照'字母顺序'排列
++++++++++++++++'分割线'++++++++++++++++
注意:如果比较操作符'混用'字符串和数值,Lua语言会'抛出异常'
2 < "15" -->'报错'
三 字符串标准库
(1)len
string.'len(arg)'
计算字符串'长度'-->等价方式:'#arg'
(2)rep
string.'rep(string, n)'
备注:rep-->repate-->'重复'
功能:返回字符串string的'n个拷贝'
说明:将字符串string'重复n次'
需求:创建'1MB大小'的测试字符串
1M=1024KB=1024*1024B=2^10*2^10='2^20'B
1B=1Byte='8bit'
备注:Byte-->'字节';bit-->'位'
例子: string.rep('a,'2^20)
+++++++++++++'分割线'+++++++++++++
01000001('二进制')-->'8位'-->65-->'ASCII码'-->'A字符'
(3)reverse
string.'reverse(str)'
字符串'反转'
(4)大小写转换
string.upper(str) -->'转换为大写'
string.lower(str) -->'转换为小写'
字符串'大小写转换'
(5)sub
需求: 去掉'两端'的'第一个'字符
string.sub(s,2,-2)
实际理解:返回的是去掉字符串's'中的第一个和最后一个字符
++++++++++'注意事项'++++++++++
Lua语言中的'字符串是不可变':函数string.sub'不会改变'原有字符串的值,只是'返回一个新字符串'
修改'原字符串': s = string.sub(s,-2,-2)
(6)char
-- 整数 ASCII 码'转换为'字符
string.char(number)
说明:'number'必须是字符对应的'ASCII码'
+++++++++++++++++'ASCII的最大值和最小值'+++++++++++++++++
常见ASCII码的'大小规则':0~9<A~Z<a~z
(7)byte
string.byte(s[,int])
功能:byte 将字符串中的'字符'转化为对应的'ASCII码'-->整数值
特点:返回字符串's'中第'i个字符'的内部数值
备注:如果'不指定'某个字符,默认'第一个'字符
说明:返回'索引i到j之间'-->[i,j]的'所有字符'的数值表示
(8)format
指示符--> 由一个百分号'%'和一个代表'格式化方式的字母'组成
备注:每一个指示符都会被'替换'为使用对应格式'进行格式化的对应参数'
+++++++++格式化字符串的'指示符'与'C语言中的函数printf'的规则类似+++++++++
'
格式控制符'-->'以%开头',常用的有以下几种:
1)%s - 接受一个字符串并按照'给定的参数'格式化该字符串
2)
%d - 接受一个数字并将其转化为'有符号的整数'格式
3)
%f - 接受一个数字并将其转化为'浮点数格式'(小数),默认'保留6位'小数,不足位用'0填充'
4)
%x - 接受一个数字并将其转化为'小写的十六进制'格式
5)
%X - 接受一个数字并将其转化为'大写的十六进制'格式
+++++++++++++++++++++'扩展'+++++++++++++++++++++
%s '空白符'
%p 标点
%c 控制字符
%z 代表0的字符
%a '字母'
%l 小写字母
%u 大写字母
%w '字母数字'
细节: 在'百分号和字母之间'可以包含用于'控制格式细节'的选项-->'注意位置'
例如:%.4f-->'保留4位小数'、%02d-->'十进制'至少由两个数字'组成,'不足'两个数字'用0补齐'、%2d-->'表示用空格来补齐'
(9)模式匹配的函数
string.find (str, substr, [init, [end]])
在一个'指定的目标字符串'中'搜索'指定的内容(第三个参数为'索引'),返回其'具体位置'
备注:如果'没有找到-->不存在',则返回 nil
++++++++++++++'分割线'++++++++++++++
1)string.find '默认'情况下'返回两个值',即查找到的子串的'起止'下标,如果不存在匹配'返回 nil'
2)如果我们只想要 string.find 返回的第二个值, 可以使用 '虚变量'(即'下划线')省略
① 子串匹配
(10)gsub
string.'gsub'函数的'返回值'有两个
1)第一个是返回'匹配后的字符串'-->'不匹配'的话返回'原字符串拷贝'
2)第二个是'匹配的次数'-->'替换的次数'
备注:string.gsub函数'不会改变'原字符串,只是'拷贝操作'
① 语法
② pattern 模式串可用的正则
lua中的正则
③ 字符串
④ 函数形式 高级
⑤ table形式
(10)math
openresty:string.match 目前并'不能被 JIT 编译',应 尽量 使用 ngx_lua 模块提供的 'ngx.re.match' 等接口
① 案例1
local string = "{1,2,3,4}"
local to_string=string.match(string , "%d+,%d+,%d+,%d+")
# 此时tranString = "1,2,3,4",去掉"{","}"
++++++++++ "分割线" ++++++++++
//'\d'表示数字 \d+表示'最长(贪婪)'匹配多个数字
var v = string.match("abcd1234", "\d+");
# 显示v等于"1234"
思考:'\d'和'%d'的区别?
② 案例2
var v,v2 = string.match("abcd", "(ab)(cd)");
# 效果:显示v等于"ab" v2等于"cd"
// 如果"不显示"的用'括号'指定捕获,函数将"捕获整个"匹配模式
+++++++++ "匹配超链接" +++++++++
string.match(content,'%a+%:%/%/%w[%w-]*[%.%w*]+%.?')
(11)gmatch
openresty:此函数目前并'不能被 LuaJIT 所 JIT 编译',而只能被解释执行。应 尽量 使用 ngx_lua 模块提供的 ngx.re.gmatch 等接口。
① 普通
② for循环
③ 捕获场景
四 编码
ASCII、字节、字符、UTF-8、二进制、Unicode、编码、解码
字符:'计量'单位
字符:使用数字、字母、符号、汉字