1
x,y = string.match("hello world", "(%a+)%s*(%1)")
print(x,y)
第一个(%a+)一定会匹配到hello,接着%s*匹配到一个空格,(%1)是第一次的匹配结果,所以是hello,但空格后面并不是hello,所以结果一定不会是hello hello。其实根据模式串可以看出,它匹配的一定是一个(xyz xyz)这种重复对称的字符串,因此会匹配出L L(该是小写)。
2
x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") --> x="world hello Lua from"
分析模式串,一定是在找一个被空格分隔的两个字符串(但也不一定真的有空格,因为是*号),匹配到之后(2个匹配),交换第一个匹配和第二个匹配。
加入是下面的这种情况看,
x = string.gsub("hello", "(%w+)%s*(%w+)", "%2 %1")
----> x = "o hell"
这个会涉及贪婪匹配的问题,第一个匹配会尽可能多的匹配,而第二个匹配至少得有一个字符,因此就会得到这样的结果。