lua_string_pattern

两大特点:

1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...

2. string库中所有的function都不会直接操作字符串,而是返回一个新的字符串。

 

库函数:

1、string.len,string.rep,string.upper,string.lower,string.sub,string.format

local str = "abc"

print(string.len(str)) --6

print(string.rep(str, 2^2)) --abcabcabcabc

print(string.upper(str)) --ABC

print(string.lower("ABC")) --abc

print(string.format("%02d/%02d/%04d", 5, 12, 2001))--05/12/2001

print(string.sub(str, 1, 2))--ab

截取字符串str的从第i个字符到第j个字符之间的串。

lua中,字符串的第一个字符索引从1开始,你也可以使用负值,不提供第三个参数,则默认为-1,

 

2、string.char,string.byte

  string.byte (s [, i [, j] ])函数返回字符s[i], s[i+1], ···, s[j]的内部数字编码(ASCII码),其

      中参数i的默认值是1,而参数j的默认值是i。需要注意的是该函数在返回的数字编码在跨平台方面不一定是可移植的。

local i=97

print(string.char(i))--a

print(string.char(i, i+1, i+2))--abc

print(string.byte("abc"))--97

print(string.byte("abc", 2))--98

print(string.byte("abc", -1))--99

print(string.byte('abc', 1, 3))--97 98 99

string.char函数和string.byte函数用来处理字符和数字之间转换。

string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。

string.byte(s,i)将字符串s的第i个字符的转换成整数,第二个参数可选,默认为1。

 

 

3、string.find, string.match

在目标串内搜索匹配指定的模式串。如果找到则返回对应的位置,否则返回nil。

local str = "hello world"

local i, j = string.find(str, "hello")

print(i, j) -- 1      5

print(string.find(str, "lll"))--nil

   string.find( )的第三个参数是可选的:标示目标串中搜索的起始位置。

查找目标串中某单次出现的次数:

local str = "hello Maria! hello Mical! hello Sam!"

local sum = 0

local idx = 0

repeat

      idx = string.find(str, "hello", idx+1)

      if idx then

             sum = sum + 1

      end

until idx == nil

print("sum: ", sum) -- 3

--string.match和string.find类似,都是在指定的string中查找相应的模式。不同的是,他返回的是找到的那部分string

 

4、string.gsub

函数有四个参数:目标串,模式串,替换串,(可选:最多替换的个数)

返回替换后的字符串和替换的次数。

local str1 = "hello Maria! hello Mical! hello Sam!"

local str2, times1 = string.gsub(str1, "hello", "hi")

print( str2, times1) --hi Maria! hi Mical! hi Sam!3

 

local str3, times2 = string.gsub(str1, "hello", "hi", 2)

print( str3, times2) --hi Maria! hi Mical! hello Sam!2

 

string.gsub(s, pattern, func)

local strr = string.gsub(str1, "hello", function(s)

      return s.."_"

end)

print(strr)--hello_ Maria! hello_ Mical! hello_ Sam!

 

5、string.gfind(s, pattern)

返回一个迭代器,迭代器每执行一次,返回下一个匹配串;

iter = string.gfind("a=b c=d", "[^%s+]=[^%s+]")

print(iter()) -- a=b

print(iter()) -- c=d

通常用于泛性for循环,下面的例子结果同上

for s in string.gfind("a=b c=d", "[^%s+]=[^%s+]") do

      print(s) -- a=b c=d

end

 6、string.dump (function [, strip])

  返回包含有以二进制方式表示的(一个 二进制代码块 )指定函数的字符串。

function log(value)print(value)
endlocal str_fun = string.dump(log)print(str_fun) --<-LoaQlocal fun = loadstring(str_fun)fun("hello")

 

 

模式:

对lua而言,模式串就是普通的字符串,并不受特殊对待。

1、字符类

.            任意字符

%a        字母

%c         控制字符

%d        数字

%l         小写字母

%p        标点字符

%s         空白符

%u        大写字母

%w       字符和数字

%z         代表0的字符

上面字符类的大写形式表示小写所代表的集合的补集。例如,'%A'表示非字母的字符。print(string.gsub("hello world", "%A", "_")) --hello_world 1

2、特殊字符

(     )      .      %    +     -      *     ?     [      ^     $

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

用'[]'创建字符集:(可以使用连字符'-',在'[]'开始出使用'^'表示补集)

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

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

      '[%[%]]'  匹配方括号。

      '[0-9]'     匹配0到9之间的数

      '[^0-7]'   匹配不是0到7之间的字符

3、模式修饰符

+ 匹配前一字符1次或多次,最长匹配

* 匹配前一字符0次或多次,最长匹配

- 匹配前一字符0次或多次,最短匹配

? 匹配前一字符0次或1

 

'+'匹配一个或多个字符,总是进行最长匹配。

print(string.gsub("hello Sam.", "%a+", "***")) --*** ***.2

'*'与'+'类似,但是它匹配一个字符0次或多次出现。

 '-'与'*'一样,都匹配一个字符的0次或多次出现,但是它进行的是最短匹配。

print(string.gsub("(hello)world)", "%(.*%)", "*")) --*1

print(string.gsub("(hello)world)", "%(.-%)", "*")) --*world)1

 

 

以'^'开头的模式只匹配目标串的开始部分,以'$'结尾的模式只匹配目标串的结尾部分。

print(string.gsub("(hello)(world)", "%(.-%)", "*")) --**2

print(string.gsub("(hello)(world)", "^%(.-%)", "*")) --*(world)1

print(string.gsub("(hello)(world)", "%(.-%)$", "*")) --*1

 

'%b'用来匹配对称的字符。常写为'%bxy',x和y是任意两个不同的字符;x作为匹配的开始,y作为匹配的结束。

 

'%b()'    匹配以'('开始,以')'结束的字符串。

'%b[]'    '%b<>'

 

function string.split(input, delimiter)input = tostring(input)delimiter = tostring(delimiter)if (delimiter=='') then return false endlocal pos,arr = 0, {}-- for each divider foundfor st,sp in function() return string.find(input, delimiter, pos, true) end dotable.insert(arr, string.sub(input, pos, st - 1))pos = sp + 1endtable.insert(arr, string.sub(input, pos))return arr
end

 

 

--[[

UTF-8

0000 - 007F

0XXXX XXXX

0080 - 07FF

110XXXXX  10XXXXXX

0800 - FFFF

1110XXXX  10XXXXXX 10XXXXXX

]]

 

转载于:https://www.cnblogs.com/wrbxdj/p/5417978.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pyqt5学习】QLayout: Attempting to add QLayout “to ***“, which already has a layout

报错场景&原因 在界面设计时&#xff0c;想实时更新用matplotlib绘制的图像,即会一次次的调用plot函数&#xff0c;这样就会重复地向groupbox里面添加布局&#xff0c;但是一个容器只能有一个布局&#xff0c;因此会报错 def __init__(self):super(weibo_search_logic, se…

3D打印材料PLA,ABS对比

转载于:https://www.cnblogs.com/sztom/p/6373910.html

扒一扒工业机器人编程语言和种类

机器人编程语言&#xff08;一&#xff09; 伴随着机器人的发展&#xff0c;机器人语言也得到发展和完善。机器人语言已成为机器人技术的一个重要部分。机器人的功能除了依靠机器人硬件的支持外&#xff0c;相当一部分依赖机器人语言来完成。早期的机器人由于功能单一&#xff…

Java继承概述以及Java继承案例和继承的好处

Java继承概述 1.多个类中存在相同属性和行为时&#xff0c;将这些内容抽取到单独一个类中&#xff0c;那么多个类无需再定义这些相同属性和行为&#xff0c;只要继承那个类即可。 2.在Java中通过extends关键字可以实现类与类的继承。 例如&#xff1a;class 子类名 extends 父类…

描述用户场景

每一个组员根据自己所承担的项目&#xff0c;描绘用户场景并将典型用户和用户场景描述&#xff01; 典型用户 ①当代大学生们&#xff0c;我们的收入多数是来自家庭父母给的生活费&#xff0c;或者还包括一些自己打工挣的零块。收入也就这么几个来源&#xff0c;但是支出却多种…

【pyqt5学习】——控件绑定槽函数的同时利用lambda实现传参

两种方法&#xff1a; 1、利用pyqtsignal的emit进行传参 2、connect函数进行传参 self.pushButton.clicked.connect(lambda:self.readZodiacByButtonText(self.pushButton.text())) # 根据按钮上的文字来进行阅读def readZodiacByButtonText(self,text):if self.language &…

如何用MaskBlt实现两个位图的合并,从而实现背景透明

我有两个位图&#xff0c;一个前景图&#xff0c;一个背景图&#xff08;mask用途&#xff09;。请问如何用MaskBlt实现两个位图的合并&#xff0c;从而实现背景透明&#xff01; 核心代码&#xff1a;dcImage.SetBkColor(crColour);dcMask.BitBlt(0, 0, nWidth, nHeight, &…

史陶比尔与机器人之父

早在1982年&#xff0c;史陶比尔已经成立了工业机器人部门&#xff0c;经销美国UNIMATION公司的PUMA机器人&#xff0c;1988年&#xff0c;史陶比尔成功收购了 UNIMATION。而UNIMATION是世界上最著名的机器人专家恩格尔伯格所创立的企业&#xff0c;PUMA正是世界上第一台工业机…

git进阶

Git 进阶用法 Git 高阶用法 1. 基本概念 你的本地仓库由Git维护的三棵树组成。第一个是你的工作目录&#xff0c;它持有实际文件&#xff1b; 第二个是缓存区(index),它像个缓存区域&#xff0c;临时保存您的改动&#xff1b;最后是HEAD,指向你最近 一次提交后的结果。 git add…

lab3

lamp: 在阿里云linux&#xff08;Ubuntu&#xff09;上安装Apache mysql php &#xff1a; apt-get install mysql_server mysql_client php5 php_mysql apache2 系统会提示正确的包的名称 安装ECShop 在本地命令行 scp ecshop.zip rootxxx.xxx.xx.xxx:/var/www/ 把压缩文件拷贝…

【python学习】——pyttsx3库实现文本朗读、音量、音速等调节

import pyttsx3# 初始化朗读引擎 engine pyttsx3.init() # 设置朗读速度 self.engine.setProperty(rate, 120) # text为需要读取的内容 self.engine.say(text) # 不添加下面这句&#xff0c;没有声音 self.engine.runAndWait()pyttsx3其他应用&#xff1a; python pyttsx3实现…

mysql中如何判断某个字段是纯数字

SELECT * FROM m_customer WHERE LENGTH(0nickname) LENGTH(nickname); 原理是nickname字段如果某一位不是数字,那么跟0相加后只会保留不是数字的那一位之前的值, 比如SELECT 011a1bc FROM DUAL;结果是11,SELECT 0a1bc FROM DUAL;结果是0转载于:https://www.cnblogs.com/wangx…

Variable Assembly Language可变汇编语言

Variable Assembly Language可变汇编语言 可变汇编语言&#xff08;Variable Assembly Language, VAL&#xff09;是一个设计给Unimation Inc.工业机器人用的电脑控制系统及编程语言。VAL机器人语言是会被永久地储存于系统内&#xff0c;这包括了个体应用软件的导向。VAL能从容…

在ABAP里实现条件断点的三种方式

背景 有不同的同事问我这个问题&#xff1a;例如下图的LOOP要执行1000次&#xff0c;我只对其中的某一次比如第501次循环感兴趣&#xff0c;我肯定不可能按500次F5然后进入第501次的调试。或者我只对LOOP里某个变量为某一个具体值的那一次循环感兴趣。如何才能避免重复按F5,让断…

【pyqt5学习】——添加菜单栏动作action,给动作触发triggered绑定事件

1、打开qt-designer工具——视图——勾选上动作编辑器 2、勾选后右下方会出现动作编辑器栏 3、在改面板可以进行已有动作的属性编辑&#xff0c;也可以添加新的动作 4、 鼠标左键选中动作不松开&#xff0c;可以将动作拖到菜单栏 5、给动作绑定事件 self.saveLog.triggered.co…

什么情况下会调用到session_destroy()

https://segmentfault.com/q/1010000000191102 首先 ... session_destory() 是一个函数 ... 这个函数在任何情况下都不会被 php 引擎自动调用 ... 只能你手工去调用 ... php 内部存在着清理 session 的机制 ... 但与这个函数完全无关 ... 如果你想问的是什么时候该手工调用这个…

对永磁无刷电机的调速过程

考虑了一下对永磁无刷电机的调速过程。 一般把使用永磁转子、无电刷的电机&#xff0c;根据驱动方式分为永磁同步与直流无刷。其实没有本质区别。在此称为永磁无刷。 用永磁无刷电机的分子泵驱动器一向调速做得不太好。这两年好一些了&#xff0c;但是还是不能完全满意。李老…

C# / VB.NET合并PDF指定页

在前面的文章中&#xff0c;我们已经知道如何合并、拆分多个PDF文件&#xff0c;在这篇文章中的合并、拆分PDF文档主要是以方便文档管理的目的来操作文档&#xff0c;在文档查阅、管理及存储上很方便实用。但是我们如果想要合并多个文档中的部分文档页的内容&#xff0c;该如何…

高级异常

一、什么是异常 解析&#xff1a;异常就是在程序的运行过程中所发生的不正常事件 二、Java异常处理是通过5个关键字来解决的&#xff1a;try、catch、finally、&#xff08;前三个是捕获异常&#xff09;throw&#xff08;手动抛出异常&#xff09;、throws&#xff08;声明异常…

【纠错】——错误:PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。“+解决方案

目录 问题出现场景 原因 解决方案 问题出现场景 先打开pdf文件&#xff0c;获取pdf文件内容后&#xff0c;利用os.remove()来删除文件&#xff0c;这时候出现错误 os.remove(source_path)PermissionError: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。…