Skip to content

Latest commit

 

History

History
61 lines (36 loc) · 2.51 KB

0X3A捕获和其他.md

File metadata and controls

61 lines (36 loc) · 2.51 KB

0X3A 捕获和其他

前置知识

  • 0X39 长度匹配

正文

捕获(Captures)

在模式中可以用括号括起来一部分模式.这部分模式将被"捕获".被捕获意味着在返回值的时候它们会作为额外的值返回.例如我需要获取一个被花括号括起来的子串.

str='nhn{aen}tgu'
string.find(str,'%a*(%b{})%a*')

在处理一些包含有重复内容的模式时,可以使用捕获的扩展功能.用'%'后加一个数字n.表示重复本字符串开始以来定义的第n个捕获(n必须是1到9以内的).例如:

str='cccab12ab12eee'
string.find(str,'(ab)(12)%1%2')

这里返回的头两个值匹配到的是'ab12ab12',然后返回'ab'和'12'.用数字引用捕获定义不会导致额外的返回值.

如果捕获有嵌套,在同一个捕获内部的同级的捕获之间按出现的先后排列(只有当一个捕获及其内部嵌套的捕获全部返回了才算它完全返回了,轮到同级的下一个捕获).不同级别的捕获,外层的比其内层的捕获排在前边.例如:

string.find('abcdefghijk','((ab)c(de))(fg)')

其他的匹配函数

除了string.find,正则表达式的模式字符串还能用于其他函数.

string.gmatch (s, pattern)这个函数会返回一个迭代器,其中包含了s中所有符合pattern的子串.

string.match(s,pattern)会返回检测到的第一个符合pattern的s的子串,即使没有使用捕获表达式.可以接受第三个参数用于指定搜索的起点.

string.gsub(s,pattern,repl)不会改变s本身.但是它的返回值是把s中所有符合pattern的地方都用替换(第二个返回值为替换的地方的个数).

如果repl是字符串,则用repl替换.如果repl中含有捕获中百分号加数字的写法,这些占位符会被捕获的子串替换.如果是'%0'表示整个匹配到串.'%%'表示一个百分号.

如果repl是函数,每次替换都会调用这个函数并且用函数返回值替换.在调用函数的时候,会把捕获到的字符串作为参数传递给函数.

如果repl是表,则在每次替换的时候会先用第一个捕获到的字符串在表中查表,然后把返回值用于替换.(查表结果或者函数返回值为为false或者nil则不会替换,原字符串这一部分保持原样.)

在任何情况下如果没有模式pattern没有指定捕获则进行普通文本替换.

变量名小技巧

介绍一个之前忘记介绍的小技巧不需要的变量可以用_占位接收.

position,_=string.find('abbbbbcen','b*')

后续推荐

暂无