帮助:模块/字符串
字符串是Lua语言中,用来存储文本类型数据的一种数据类型。
表示方式[编辑]
字符串可以使用三种方式表示:
- 两个英文半角单引号
'
之间的一串字符 - 两个英文半角双引号
"
之间的一串字符 - 一组成对的英文半角双方括号
[[
和]]
之间的一串字符
需要使用一组半角单引号或是一组半角双引号来表示。
举例:
string = "this is a pit!" -- 正确 string = 'this is a pit!' -- 正确 string = this is a pit! -- 错误,字符串前后没有引号 string = "this is a pit!' -- 错误,字符串前后的引号需要一致(都是单引号或是都是双引号) string = “this is a pit!” -- 错误,引号必须是英文半角引号,不能使用中文全角引号 string = [[ 欢迎来到心百科! 这是一个跟心理有关的百科, 结果搞得像个技术网站! ]] -- 正确,不过需要注意的是:该段文本中的换行,在Mediawiki中也会被解析成一个空格
转义符号[编辑]
转义符用于不能直接显示的字符,在Medaiwiki中,主要会用到的是以下几种转义符
转义字符 | 转义结果 | 说明 |
---|---|---|
\\ |
\ |
因为转义字符是以\ 开始的,所以当需要显示\ 时,就需要进行一次转义
|
\' |
' |
详见后面的例子 |
\" |
" |
详见后面的例子 |
\n |
换行符 | 需要注意的是,这个换行符和在wikitext中写入一个回车是同样的效果,也就是说,当只出现一个换行符时,会被Mediawiki转成一个空格;而连续出现两个换行符时,则会另起一个新的p 标签
|
字符串中如果需要出现引号的话,可以使用另外一种引号来表示字符串。如果两种引号都需要出现的话,则需要使用上面提到的转义符号。例如:
string = "this is a "pit"!" -- 错误,字符串中出现了双引号,干扰了程序的判断 string = 'this is a "pit"!' -- 正确,字符串中出现了双引号,所以改用单引号来表示字符串 string = "this is a \"pit\"!" -- 正确,\"会在使用时,被当作"处理,而且不会干扰程序将此段内容判断为一个字符串
运算符[编辑]
字符串可以使用算术运算符,Lua会尝试将字符串转成number
型后再进行运算,如果转换失败,将会出错。
"5" + 10 -- 结果为15 "5" + "10" -- 结果为15 "5 + 10" -- 结果为"5 + 10",因为运算符被当作字符串中的字符了 "max" + 10 -- 会报错,因为max转换成number型时会返回nil,nil不能和10进行“+”运算,所以会报错
字符串还可以使用以下两种运算符:
-- 字符串连接符:“..”(两个连续的英文半角点) -- 该运算符会将两个string连接成一个新的string string = "this is ".."a pit!" -- 结果为 "this is a pit!" -- 长度运算符:“#”(英文半角井号) -- 该运算符可以获得字符串的长度 -- 不过因为中文字符编码的问题,每个中文字符获得的长度并不是1,所以当字符串中包含中文,需要获取长度的时候,请使用后面介绍的字符串操作mw.ustring.len(s) string_length = #"this is a pit!" -- 结果为 14
转换为字符串[编辑]
函数tostring(e)
可以将参数e
转换为string
类型。
该函数实际上是调用参数e
的元方法__tostring
,所以当e
没有这个元方法时,将无法使用。
例如:
tostring(100) -- 结果为"100",数据类型从number转变成string
字符串操作[编辑]
Lua提供了String
库,来对字符串进行各种操作,不过该库并不支持UTF-8
编码,所以Mediawiki又提供了一个Ustring
库来替代String
库的功能。
在Mediawiki中使用Lua时,尽量使用Ustring
库进行字符串操作,以避免碰到中文时出错。
本处介绍的字符串操作,都是编写Wiki中比较容易用到的,更多字符串操作请参考这里。
转换大小写[编辑]
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.upper(s) |
mw.ustring.upper(s) |
将字符串中所有英文字母,转换为大写字母 |
string.lower(s) |
mw.ustring.lower(s) |
将字符串中所有英文字母,转换为小写字母 |
参数 | ||||
---|---|---|---|---|
参数 | 类型 | 必要 | 说明 | |
s | string
|
必填 | 需要转换的字符串 | |
返回值 | ||||
序号 | 类型 | 说明 | ||
第1个 | string
|
字符串中所有英文字母转换为大写或小写后的字符串 |
示例:
local text = 'Abc您好Def' mw.log(mw.ustring.upper(text)) -- 结果:"ABC您好DEF" mw.log(mw.ustring.lower(text)) -- 结果:"abc您好def"
获取字符串长度[编辑]
如果是纯英文、数字、半角符号的字符串,可以使用求长度运算符#
。
当字符串包含中文的时候,只有使用Ustring
库里的mw.ustring.len(s)
函数才能获取到正确的结果。
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.len(s) |
mw.ustring.len(s) |
获取字符串的长度 |
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 需要计算长度的字符串 |
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | number
|
字符串的长度值 |
示例:
local text = 'Abc您好Def' mw.log(string.len(text)) -- 结果:12(错误),因为String库不支持UTF-8编码 mw.log(mw.ustring.len(text)) -- 结果:8(正确),遇到中文字符串时,需要使用Ustring库才可以正确取到长度
查找字符串[编辑]
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.find(s, pattern, init, plain) |
mw.ustring.find(s, pattern, init, plain) |
在字符串s 中,查找符合pattern 描述的子字符串的开始和结束位置
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 原始字符串,函数将在该字符串中进行查找 |
pattern | string
|
必填 | 需要查找的匹配式(请参考匹配式)或子字符串 初学者提示 如果您是初学者,可以不去理解匹配式,此参数只填写需要查找的子字符串即可 |
init | number
|
可选 | 从第几位开始查找,默认值为1,必须填整数,可以填负数(将从字符串末尾往前数若干位作为开始) |
plain | boolean
|
可选 | 不适合初学者 默认为false ,设为true 的时候,参数pattern 将不被视为匹配式,而是直接当做字符串匹配需要指定 plain 时,必须先指定init 的值,可以填写默认值1 从头查找。
|
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | number
|
返回第一个符合条件的子字符串的起始位置。如果没有找到,则返回nil
| |
第2个 | number
|
返回第一个符合条件的子字符串的结束位置。 |
示例:
local text = 'Abc您好Def' local text_start, text_end = mw.ustring.find(text, '您好') mw.log("start:"..text_start..", end:"..text_end) -- 结果:start:4, end:5
截取字符串[编辑]
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.sub(s, i, j) |
mw.ustring.sub(s, i, j) |
截取字符串s 中,从第i 位到第j 位的内容
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 原始字符串,函数在该字符串中进行截取 |
i | number
|
必填 | 截取的开始位置(截取的内容包括开始位置) |
j | number
|
可选 | 截取的结尾位置(截取的内容包括结束位置),默认值为-1(即剩余的全部字符串),必须填整数,可以填负数(将从字符串末尾往前数若干位作为开始) |
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | string
|
返回截取出的字符串 |
示例:
local text = 'Abc您好Def' mw.log(mw.ustring.sub(text, 4, 5)) -- 结果:"您好",注意4和5两个位置都是包括在结果里的。
替换字符串[编辑]
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.gsub(s, pattern, repl, n) |
mw.ustring.gsub(s, pattern, repl, n) |
在字符串s 中,查找所有(如果指定了n 的值,则是前n 个)符合pattern 描述的子字符串,将其根据repl 进行替换
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 原始字符串,函数在该字符串中进行替换 |
pattern | string
|
必填 | 需要查找的匹配式(请参考匹配式)或子字符串 初学者提示 如果您是初学者,可以不去理解匹配式,此参数只填写需要查找的子字符串即可 |
repl | string
|
必填 | 当repl 为string 类型时,函数会将符合条件的子字符串,替换为repl 的值。repl 中如果需要使用% 符号,需要使用%% 来转义不适合初学者 如果匹配式中有捕获字符串的话,可以使用 % 加数字1到9来(如%1 )来使用捕获结果
|
table
|
不适合初学者 当repl 为table 类型时,函数会将符合条件的子字符串,当作Key,去table中查询,查询结果不为nil 时,将会进行替换。该模式不支持捕获
| ||
function
|
不适合初学者 当repl 为function 类型时,函数会将符合条件的子字符串,当作参数,调取一次该函数,将第一个返回值作为替换结果
| ||
n | number
|
可选 | 如果不指定该参数,则默认替换s 中所有符合条件的子字符串。如果指定了该参数,则只替换前n 个
|
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | string
|
返回进行替换后的字符串 | |
第2个 | number
|
返回符合pattern 描述的子字符串数量
|
示例:
-- 初学者内容 local text = 'Abc 您好 Def' mw.log(mw.ustring.gsub(text, '您好', '再见')) -- 结果:"Abc 再见 Def"和1 -- 高级内容 mw.log(mw.ustring.gsub(text, '%a+', '您也好')) -- 结果:"您也好 您也好 您也好"和3 mw.log(mw.ustring.gsub(text, '(%a+)', '值是%1')) -- 结果:"值是Abc 值是您好 值是Def"和3 mw.log(mw.ustring.gsub(text, '%a+', {Abc='XXX', Def='YYY'})) -- 结果:"XXX 您好 YYY"和3
格式化字符串[编辑]
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.format(s, ...) |
mw.ustring.format(s, ...) |
格式化字符串s 中,后面的参数将依次填入s中出现的代号
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 具有特定格式的字符串,具体请参考后面的说明 |
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | string
|
格式化后的字符串 |
接受的格式代号如下表,注意大小写是不同的符号:
格式符号 | 数据类型 | 说明 |
---|---|---|
%s |
string |
将字符串格式化后显示 |
%q |
string |
不适合初学者 将字符串转化成可安全被Lua编译器读入的格式 |
%d / %i |
number |
将数字转化成有符号(signed)的整数格式 |
%f |
number |
将数字转化成浮点数格式 |
%c |
number |
将数字转化为ASCII码表中对应的字符 |
%u |
number |
不适合初学者 将数字转化成无符号(unsigned)的整数格式 |
%o |
number |
将数字转化成八进制数字 |
%x / %X |
number |
将数字转化成十六进制数字,%x 使用小写字母,%X 使用大写字母
|
%e / %E |
number |
将数字转化成科学技术法格式,%e 使用小写字母e,%E 使用大写字母E
|
%g / %G |
number |
将数字转化成“科学技术法”和“浮点数”中,长度比较短的那种格式,%g 使用小写字母e,%G 使用大写字母E
|
为了进一步细化,还可以在格式符号的%
后添加下列参数。需要注意的是,参数按照下表的顺序进行读取,所以填写时要保证好顺序:
参数 | 说明 |
---|---|
+ |
会显示数字的正号。不添加此参数时,只有负号才会显示,添加后正号也会显示 |
0 |
当指定了字符串宽度的时候,数字长度不足位的时候,会使用空格填充,如果指定了0 参数,则改为用0填充(可以参考后面的例子)
|
- |
当指定了字符串宽度,并且没有指定使用0填充时,空格会在字符串的左侧(字符串右对齐),如果添加- 参数,空格会在字符串右侧(字符串左对齐)
|
n |
n需要填写一个整数。该整数会指定字符串宽度,注意这个宽度会包括正负号、小数点以及小数部分 |
.n |
n需要填写一个整数,该整数会指定小数保留长度。另外也可以用来切割字符串(对%s 使用时),但对中文支持并不好,不推荐使用
|
示例:
-- 格式化字符串
mw.log(mw.ustring.format('将字符串格式化进来:%s,格式化的后面文字', '文字文字')) -- 结果:"将字符串格式化进来:文字文字,格式化的后面文字"
-- 格式化整数,补位0
mw.log(mw.ustring.format('格式化日期格式为YYYY/MM/DD:%04d/%02d/%02d', 2017,7,7)) -- 结果:"格式化日期格式为YYYY/MM/DD:2017/07/07"
-- %d表示只显示整数,%4d表示是一个四位的整数(不足的位数用空格补齐),%04d表示这是一个四位整数(不足的位数用0补齐)
-- 格式化小数
mw.log(mw.ustring.format('%.2f', 10)) -- 结果:"10.00"
-- %f表示小数(小数点后会保留默认位),%.2f表示小数点后保留两位小数,不足的会补0
-- 综合
mw.log(mw.ustring.format('%+08.2f', 10)) -- 结果:"+0010.00"
-- +表示显示数字的正号;0表示不足位时填充0;8表示字符串总宽度为8;.2表示小数部分保留2位
-- 需要注意的是宽度8包括了正号和小数点,所以数字部分只剩下6位(4位整数部分,2位小数部分)
匹配式[编辑]
本段落介绍的内容,不适合程序语言的初学者学习
Lua的匹配式(pattern),实际上是一个简化版本的正则表达式,可以用在string.find
,string.gsub
,string.match
和string.gmatch
函数中,对应到Ustring
库,则是mw.ustring.find
,mw.ustring.gsub
,mw.ustring.match
和mw.ustring.gmatch
函数。使用的格式是匹配式+数量词。
- 例如
mw.ustring.match(text,"%a+") //从字符串变量text中匹配1个或者多个字母字符(总是匹配尽量多的字符)
匹配式 | 说明 | 匹配式 | 说明 |
---|---|---|---|
单个字符 | 与该字符自身进行匹配,但不包括以下保留字符:^ $ . [ ] * + - ? 这些保留字符如果需要进行匹配,需要在字符前加 % 进行转义,例如 %$ 表示$
| ||
. |
与任意字符匹配 | ||
%a |
与任意字母匹配 | %A |
与任意非字母的字符匹配 |
%d |
与任意数字匹配 | %D |
与任意非数字的字符匹配 |
%w |
与任意字母或数字匹配 | %W |
与任意非字母且非数字的字符匹配 |
%c |
与任意控制符匹配,例如\n |
%C |
与任意非控制符匹配 |
%l |
与任意小写字母匹配 | %L |
与任意非小写字母的字符匹配 |
%u |
与任意大写字母匹配 | %U |
与任意非大写字母的字符匹配 |
%p |
与任意标点匹配 | %P |
与任意非标点的字符匹配 |
%s |
与空白字符匹配 | %S |
与任意非空白字符匹配 |
%x |
与任意十六进制数字匹配 | %X |
与任意非十六进制数字匹配 |
%z |
与任意代表0的字符匹配 | %Z |
与任意不代表0的字符匹配 |
[描述] |
描述可以填写多个字符符号 该匹配式表示与多个字符符号任意一个匹配的字符 |
[^...] |
描述可以填写多个字符符号 该匹配式表示与多个字符符号都不匹配的字符 |
以上匹配式可以用来代表各类字符,匹配的时候,会根据数量词而选择不同长度的字符进行匹配,匹配数量的多少根据匹配式后面的符号决定:
数量词 | 说明 |
---|---|
无符号 | 匹配1个符合匹配式的字符 |
* |
匹配0个或是多个该类字符,总是匹配尽量多的字符(贪婪模式) |
+ |
匹配1个或是多个该类字符,总是匹配尽量多的字符(贪婪模式) |
- |
匹配0个或是多个该类字符,总是匹配尽量少的字符(非贪婪模式) |
? |
匹配0个或是1个该类字符 |
匹配式还可以进行边界匹配:
边界匹配符 | 说明 |
---|---|
^ |
当该符号出现在开头时,表示匹配式从字符串的开头进行匹配。出现在其他位置时,仅作为该符号的匹配式使用,无特别含义 |
+ |
当该符号出现在开头时,表示匹配式会匹配到字符串的结尾。出现在其他位置时,仅作为该符号的匹配式使用,无特别含义 |
%bxy |
x和y为额外的两个任意字符,该匹配式将匹配从x到y之间的字符(x和y的数量必须平衡,例如出现xxaaybby 时,会匹配到xxaaybby 而不是xxaay )
|
匹配式还可以进行捕捉,可以用于string.gsub
和mw.ustring.gsub
的替换时使用:
捕捉相关符号 | 说明 |
---|---|
( ) |
一对半角括号之间为一次捕捉 |
%n |
其中n为一个数字,这个数字从1开始,根据捕捉的数量依次递增(第一个捕捉到的字符串%1 ,第二个为%2 …),用于替换的字符串中使用
|
匹配查找字符串[编辑]
本段落介绍的内容,不适合程序语言的初学者学习
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.match(s, pattern, init) |
mw.ustring.match(s, pattern, init) |
从字符串s 中,第init 位开始,查找匹配式pattern ,将找到的第一个结果中的捕获结果作为返回值,如果没有设置捕获,则返回匹配到的字符串。
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 原始字符串,函数在该字符串中进行匹配 |
pattern | string
|
必填 | 用于查找的匹配式 |
init | number
|
可选 | 查找的起始位置,默认为1,可以填写负数 |
返回值 | |||
序号 | 类型 | 说明 | |
不定数量 | string
|
如果在pattern 中指定了捕获,则会根据捕获数量返回同数量的返回值;如果没有指定捕获则只返回符合条件的字符串;如果没有符合条件的字符串则返回nil
|
示例:
local text = 'xxa ay bby' mw.log(mw.ustring.match(text, '%s(%w*)%s')) -- 结果:ay,匹配式的是“空白”、“0个或多个字母或数字”、“空白”连在一起,捕获是中间的“0个或多个字母或数字”,原字符串中只有“ ay ”符合匹配
匹配字符串迭代器[编辑]
本段落介绍的内容,不适合程序语言的初学者学习
String 库写法 |
Ustring 库写法 |
说明 |
---|---|---|
string.gmatch(s, pattern) |
mw.ustring.gmatch(s, pattern) |
从字符串s 中,查找所有符合匹配式pattern 的结果,返回一个迭代器用于循环
|
参数 | |||
---|---|---|---|
参数 | 类型 | 必要 | 说明 |
s | string
|
必填 | 原始字符串,函数在该字符串中进行匹配 |
pattern | string
|
必填 | 用于查找的匹配式 |
返回值 | |||
序号 | 类型 | 说明 | |
第1个 | 返回值是一个迭代器,用于循环 |