這兩天再看go的正規表示式的時候,看到關於unicode匹配的方式\p
不是很明白,所以就想寫程式來嘗試一下,因此而引出博文標題提到的乙個誤區。
首先還是先解釋下\p
到底是什麼意思。
這裡的指的是unicode的型別物件名稱,具體可在re2 syntax中檢視。其中可以用來匹配中文字元,因此下了下面的程式來驗證。
package main
import (
"fmt"
"regexp"
)func main() *`)
if err != nil
s := "foo中文哦test"
fmt.println(re.findstring(s))
}
出乎意料的是上面的程式輸出的是空,而我希望的是輸出中文哦
然後對上面的程式進行了修改
package main
import (
"fmt"
"regexp"
)func main() *`)
if err != nil
fmt.println("find:", re.findstring(s))
re, err = regexp.compile(`\p+`)
if err != nil
fmt.println("find:", re.findstring(s))
re, err = regexp.compile(`\p?`)
if err != nil
fmt.println("find:", re.findstring(s))
}
這段程式有如下輸出:
find:
find: 中文哦
find:
這就讓我疑惑了,因為從文件檢視到
原因正是因為*
和?
除了匹配盡可能多的字元,還有乙個特點就是也會匹配zero x
,因為find
只會查詢到第乙個匹配的字元,因此在*
和?
的情況下,第乙個匹配到的都是空字串,而+因為至少匹配乙個,所以其匹配到的是中文哦
我們可以通過findallstring來驗證一下:
package main
import (
"fmt"
"regexp"
)func main() *`)
if err != nil
fmt.printf("find: %q\n", re.findallstring(s,-1))
re, err = regexp.compile(`\p+`)
if err != nil
fmt.printf("find: %q\n", re.findallstring(s,-1))
re, err = regexp.compile(`\p?`)
if err != nil
fmt.printf("find: %q\n", re.findallstring(s,-1))
}
這段程式輸出了:
find: [「」 「」 「」 「中文哦」 「」 「」 「」 「」]
find: [「中文哦」]
find: [「」 「」 「」 「中」 「文」 「哦」 「」 「」 「」 「」]
正好驗證了我的猜測。
記乙個正規表示式匹配的錯誤
是這樣 1 htmlsource charset gbk 2 charset re.findall htmlsource 開始想把 gbk 匹配出來,由於html檔案的meta標籤各個 的不一樣,於是只能按照上面的寫法,先匹配出 gbk 再把 去掉,可是這麼天真的正規表示式卻匹配錯誤了,因為從地乙個...
乙個正規表示式的例子
需求 通過.net的正則 上面3個都得到 aa 並對語句稍微講解一下。謝謝。http w 這個是我寫的。不知道怎麼加上或者匹配www 還有?這個什麼意思查不到。解決 i 匹配模式,表示忽略大小寫,在.net中等價於在後面加regexoptions.ignorecase引數 http www 肯定逆序...
乙個奇怪的正規表示式
昨天,我在做網路爬蟲的時候,遇到了乙個 對文字框的輸入作了編碼處理 具體作了什麼樣的處理,前面幾句用了js的replace方法,替換了一些特殊符號,後面用了乙個正規表示式進行了特殊的編碼工作。我當時的文字 acm task force on k 12 education and technology...