濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > golang正則之命名分組方式

golang正則之命名分組方式

熱門(mén)標(biāo)簽:外呼系統(tǒng)用什么卡 電話機(jī)器人軟件免費(fèi) 百度地圖標(biāo)注后傳給手機(jī) 外呼系統(tǒng)顯本地手機(jī)號(hào) 涿州代理外呼系統(tǒng) excel地圖標(biāo)注分布數(shù)據(jù) 評(píng)價(jià)高的400電話辦理 壽光微信地圖標(biāo)注 阿克蘇地圖標(biāo)注

正則中有分組這個(gè)功能,在golang中也可以使用命名分組。

一次匹配的情況

場(chǎng)景還原如下:

有一行文本,格式為:姓名 年齡 郵箱地址

請(qǐng)將其轉(zhuǎn)換為一個(gè)map

代碼實(shí)現(xiàn)如下:

str := `Alice 20 alice@gmail.com`
// 使用命名分組,顯得更清晰
re := regexp.MustCompile(`(?Pname>[a-zA-Z]+)\s+(?Page>\d+)\s+(?Pemail>\w+@\w+(?:\.\w+)+)`)
match := re.FindStringSubmatch(str)
groupNames := re.SubexpNames()
fmt.Printf("%v, %v, %d, %d\n", match, groupNames, len(match), len(groupNames))
result := make(map[string]string)
// 轉(zhuǎn)換為map
for i, name := range groupNames {
    if i != 0  name != "" { // 第一個(gè)分組為空(也就是整個(gè)匹配)
        result[name] = match[i]
    }
}
prettyResult, _ := json.MarshalIndent(result, "", "  ")
fmt.Printf("%s\n", prettyResult)

輸出為:

[Alice 20 alice@gmail.com Alice 20 alice@gmail.com], [ name age email], 4, 4
{
  "age": "20",
  "email": "alice@gmail.com",
  "name": "Alice"
}

注意 [ name age email]有4個(gè)元素, 第一個(gè)為""。

多次匹配的情況

接上面的例子,實(shí)現(xiàn)一個(gè)更貼近現(xiàn)實(shí)的需求:

有一個(gè)文件, 內(nèi)容大致如下:

Alice 20 alice@gmail.com
Bob 25 bob@outlook.com
gerrylon 26 gerrylon@github.com
...
更多內(nèi)容

和上面一樣, 不過(guò)這次轉(zhuǎn)出來(lái)是一個(gè)slice of map, 也就是多個(gè)map。

代碼如下:

// 文件內(nèi)容直接用字符串表示
usersStr := `
    Alice 20 alice@gmail.com
    Bob 25 bob@outlook.com
    gerrylon 26 gerrylon@github.com
`
userRe := regexp.MustCompile(`(?Pname>[a-zA-Z]+)\s+(?Page>\d+)\s+(?Pemail>\w+@\w+(?:\.\w+)+)`)
// 這里要用FindAllStringSubmatch,找到所有的匹配
users := userRe.FindAllStringSubmatch(usersStr, -1)
groupNames := userRe.SubexpNames()
var result []map[string]string // slice of map
// 循環(huán)所有行
for _, user := range users {
    m := make(map[string]string)
    // 對(duì)每一行生成一個(gè)map
    for j, name := range groupNames {
        if j != 0  name != "" {
            m[name] = strings.TrimSpace(user[j])
        }
    }
    result = append(result, m)
}
prettyResult, _ := json.MarshalIndent(result, "", "  ")
fmt.Println(string(prettyResult))

輸出為:

[
  {
    "age": "20",
    "email": "alice@gmail.com",
    "name": "Alice"
  },
  {
    "age": "25",
    "email": "bob@outlook.com",
    "name": "Bob"
  },
  {
    "age": "26",
    "email": "gerrylon@github.com",
    "name": "gerrylon"
  }
]

總結(jié)

使用命名分組可以使正則表示的意義更清晰。

轉(zhuǎn)換為map更加符合人類的閱讀習(xí)慣,不過(guò)比一般的根據(jù)索引取分組值麻煩一些。

補(bǔ)充:golang 正則分組匹配多個(gè)值

看代碼吧~

import (
   "encoding/json"
   "fmt"
   "regexp"
)
str := `9x_xx:995:88`  // `9x_xx:995`
// 使用命名分組,一次匹配多個(gè)值
re := regexp.MustCompile(`(?Pfname>\w+):+(?Pmod>[1-9]*):*(?Pstrlen>[0-9]*)`)
match := re.FindStringSubmatch(str)
groupNames := re.SubexpNames()
fmt.Printf("%v, %v, %d, %d\n", match, groupNames, len(match), len(groupNames))
 
result := make(map[string]string)
if len(match) == len(groupNames) {
   // 轉(zhuǎn)換為map
   for i, name := range groupNames {
      if i != 0  name != "" { // 第一個(gè)分組為空(也就是整個(gè)匹配)
         result[name] = match[i]
      }
   }
}
prettyResult, _ := json.MarshalIndent(result, "", "  ") 
fmt.Printf("%s\n", prettyResult)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 基于golang中container/list包的用法說(shuō)明
  • Golang中List的實(shí)現(xiàn)方法示例詳解
  • golang使用grpc+go-kit模擬oauth認(rèn)證的操作
  • golang中for range的取地址操作陷阱介紹
  • golang如何去除多余空白字符(含制表符)
  • 用golang如何替換某個(gè)文件中的字符串
  • 解決golang中container/list包中的坑

標(biāo)簽:雞西 重慶 梅河口 蘭州 銅川 欽州 吐魯番 汕頭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang正則之命名分組方式》,本文關(guān)鍵詞  golang,正則,之,命名,分組,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang正則之命名分組方式》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang正則之命名分組方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    汉沽区| 丹阳市| 灵石县| 故城县| 通榆县| 左权县| 苗栗县| 泰宁县| 遂昌县| 隆子县| 荣成市| 庆元县| 景洪市| 竹山县| 嘉兴市| 伊通| 印江| 汶上县| 秦皇岛市| 承德市| 海林市| 交城县| 阿坝| 洞头县| 乐都县| 都昌县| 永吉县| 中山市| 桓台县| 桦川县| 板桥市| 临沂市| 孟津县| 游戏| 绥江县| 罗江县| 开江县| 宣威市| 姚安县| 天峨县| 湟源县|