之前在項目中,處理類似!30轉為表現的字元串時,有人寫了這樣的一段代碼“\![1-2][0-9]”,當換成luajit時啟動報錯了,出錯原因在于轉義字元使用不對。在很多語言中,正則的轉義字元是“\”,但在lua中卻不是,至少标準的不是。
引号,使用“\”進行轉義,跟字元串定義類似
local s = “\"Hello World!\””
=> 輸出 “Hello World!” - 帶雙引号
其它字元如特殊的字元(被稱為魔法字元):( ) . % + – * ? [ ] ^ $,想比對這些字元時需要加上%,比如想比對%則需要使用%%,%( 比對左括号 %) 比對右括号,如果%用于字母和數字的字元,意義就變了,比如%d、%a、%D、%U、%1。
“% + 大寫字母”是所有對應小寫字母的補集
. 所有字元
%a 字母
%c 控制字元
%d 數字
%l 小寫字母
%p 标點符号
%s 空白字元
%u 大寫字元
%w 字母和數字字元
%x 十六進制數字
%z 内部表示為0的字元
+ 重複1次或多次
* 重複0次或多次
- 也是重複0次或多次
? 出現0或1次
在lua中還是較為友善的處理嵌套的,因為它有%b - 比對對稱字元。
比如下面這個例子
local x = string.gsub(“xddddyxxxxxyxxxy”, “%bxy”, “a”)
print(x)
=>axxxxaxxa
不過要注意的是string.fromat中的格式跟C語言中的printf一樣,與上面表格列出的捕獲字元不同
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIzYwYTZwUmNwEmMxMDZwI2NlljZ3MzN4YWYlZzMwkjZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)