正規表示式 和?的乙個錯誤認識

2021-07-25 05:16:54 字數 1785 閱讀 6218

這兩天再看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...