- 0X39 长度匹配
在模式中可以用括号括起来一部分模式.这部分模式将被"捕获".被捕获意味着在返回值的时候它们会作为额外的值返回.例如我需要获取一个被花括号括起来的子串.
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*')
暂无