帮助:模块/字符串

来自心百科,心灵的百科全书
< 模块

字符串是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 必填 replstring类型时,函数会将符合条件的子字符串,替换为repl的值。repl中如果需要使用%符号,需要使用%%来转义
不适合初学者 如果匹配式中有捕获字符串的话,可以使用%加数字1到9来(如%1)来使用捕获结果
table 不适合初学者repltable类型时,函数会将符合条件的子字符串,当作Key,去table中查询,查询结果不为nil时,将会进行替换。该模式不支持捕获
function 不适合初学者replfunction类型时,函数会将符合条件的子字符串,当作参数,调取一次该函数,将第一个返回值作为替换结果
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.findstring.gsubstring.matchstring.gmatch函数中,对应到Ustring库,则是mw.ustring.findmw.ustring.gsubmw.ustring.matchmw.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.gsubmw.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个 返回值是一个迭代器,用于循环