ホーム プログラミング言語 golang go package Go 言語の正規表現: regexp パッケージ

Go 言語の正規表現: regexp パッケージ


 
 
正規表現は、パターン マッチングとテキスト操作のための複雑かつ強力なツールです。正規表現は純粋なテキストの一致に比べて効率は劣りますが、より柔軟であり、その文法規則に従って、要件に従って構築された正規表現は、元のテキストから必要な文字のほぼすべての組み合わせをフィルタリングできます。

 

Go 言語は、RE2 構文を使用する regexp パッケージを通じて正規表現を公式にサポートしています。 \c\Cを除いて、Go 言語の正規表現と Perl、 Pythonなどの言語は基本的に同じです。

正規表現の文法規則

正規表現は、通常の文字 (文字 a ~ z など) と特殊文字 (「メタ文字」と呼ばれる) のリテラル シーケンスであり、単一の文字、文字のコレクション、文字の範囲、文字間の選択などを指定できます。 、またはこれらすべてのコンポーネントの任意の組み合わせ。

次の表に、正規表現を構成するいくつかの文法規則とその意味を示します。

1) キャラクター

文法 説明する 表現例 マッチング結果
一般的な文字 それ自体と一致する ABC ABC
改行文字「\n」を除く任意の文字に一致します。DOTALL モードでは改行文字にも一致します 交流 ABC
\ エスケープ文字。後者の文字が元の意味を変更します。
文字列内に照合する必要がある文字 * がある場合は、\* または文字セット [*] を使用できます。
交流
交流
交流
交流
[…] 文字セット (文字クラス) に対応する位置は、文字セット内の任意の文字になります。
文字セット内の文字を 1 つずつリストすることも、[abc] や [ac] などの範囲を指定することもできます。
最初の文字が ^ の場合は否定を意味します。たとえば、[^abc] は abc 以外の文字を意味します。
a[bcd]e エイブかエースかエイド
\d 番号: [0-9] a\dc a1c
\D 数字ではありません: [^\d] a\Dc ABC
\s 空白文字: [<スペース>\t\r\n\f\v] \sc 交流
\S 空白以外の文字: [^\s] a\Sc ABC
\w 単語文字: [A-Za-z0-9] \トイレ ABC
\W 単語以外の文字: [^\w] トイレ 交流

2) 量指定子 (文字または (…) の後に使用)

文法 説明する 表現例 マッチング結果
* 前の文字と 0 回または無制限に一致します ABC* ab または abccc
+ 前の文字と 1 回または無制限に一致します abc+ abc または abccc
? 前の文字と 0 回または 1 回一致します ABC? ab または abc
{男} 前の文字と m 回一致します ab{2}c ABC
{m、n} 前の文字を m 回から n 回照合します。m と n は省略できます。m を省略した場合は、0 から n 回照合します。
n を省略した場合は、m を無限回まで一致させます。
ab{1,2}c abcまたはabc

3) 境界マッチング

文法 説明する 表現例 マッチング結果
^ 文字列の先頭、または複数行モードの各行の先頭と一致します。 ^abc ABC
$ 文字列の末尾、または複数行モードの各行の末尾と一致します。 ABC$ ABC
\A 文字列の先頭のみに一致する \Aabc ABC
\Z 文字列の末尾のみに一致します abc\Z ABC
\b \w と \W の間の一致 a\b!bc a!bc
\B [^\b] a\Bbc ABC

4) ロジック、グループ化

文法 説明する 表現例 マッチング結果
| | は、左と右の式のいずれでも一致する可能性があり、左側の式が最初に一致することを意味します abc|def abc または def
(…) 囲まれた式はグループとして使用され、そのグループは全体として扱われ、その後に量指定子を続けることができます。 (ABC){2} ABC
(?P<名前>…) グループ化。(…) と同じですが、追加のエイリアスが付いています。 (?P<id>abc){2} ABC
\<数字> グループ番号 <number> に一致する文字列を参照します。 (\d)abc\1 1abe1 または 5abc5
(?P=名前) エイリアス <name> を持つグループによって一致した文字列を参照します。 (?P<id>\d)abc(?P=id) 1abe1 または 5abc5

5) 特別な工事(グループとしてではない)

文法 説明する 表現例 マッチング結果
(?:…) 「|」またはその後に量指定子を付けて使用するための (…) のグループ化されていないバージョン (?:abc){2} ABC
(?iLmsux) iLmsux の各文字は一致パターンを表し、正規表現の先頭でのみ使用できます。複数のオプションはオプションです (?i)abc ABC
(?#…) # 以降はコメントとして無視されます。 abc(?#コメント)123 abc123
(?=…) 正常に一致するには、次の文字列の内容が式と一致する必要があります。 a(?=\d) その後に数字 a が続きます
(?!…) 次の文字列コンテンツが正常に一致するには、一致しない式が必要です 広告) その後に数字ではない a が続く
(?<=…) 正常に一致するには、前の文字列の内容が式と一致する必要があります (?<=\d)a 先頭に数字が付く
(?<!…) 前の文字列の内容が一致するには不一致式が必要です (?<!\d)a 前に数字が付いていない a

Regexp パッケージの使用

ここでは、regexp パッケージの使用法を示すいくつかの例を示します。

【例1】指定した型の文字列と一致します。

package main

import (
    "fmt"
    "regexp"
)

func main() {

    buf := "abc azc a7c aac 888 a9c  tac"

    //正規表現を分析し、成功したらインタープリタを返す
    reg1 := regexp.MustCompile(`a.c`)
    if reg1 == nil {
        fmt.Println("regexp err")
        return
    }

    //規則に基づいて重要な情報を抽出します。
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)
} 

操作の結果は次のようになります。

result1 =  [[abc] [azc] [a7c] [aac] [a9c]]  

[例 2] a と c を数字を含む文字列と一致させます。

package main

import (
    "fmt"
    "regexp"
)

func main() {

    buf := "abc azc a7c aac 888 a9c  tac"

    //正規表現を解析し、成功した場合は解析機を返す
    reg1 := regexp.MustCompile(`a[0-9]c`)

    if reg1 == nil { //解釈失敗、nilを返す
        fmt.Println("regexp err")
        return
    }

    //ルールに従って重要な情報を抽出する
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)
} 

操作の結果は次のようになります。

result1 =  [[a7c] [a9c]]

[例 3] a から c までの数字を含む文字列と一致するには、\d を使用します。

 package main 

import (
    "fmt"
    "regexp"
)

func main() {

    buf := "abc azc a7c aac 888 a9c  tac"

    //正規表現を解析し、インタープリタを返す
    reg1 := regexp.MustCompile(`a\dc`)
    if reg1 == nil { //解釈に失敗した場合はnilを返す
        fmt.Println("regexp err")
        return
    }

    //規則に従って重要な情報を抽出
    result1 := reg1.FindAllStringSubmatch(buf, -1)
    fmt.Println("result1 = ", result1)
} 

操作の結果は次のようになります。

result1 =  [[a7c] [a9c]]

[例 4] 文字列内の小数点を一致させます。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    buf:= "43.14 567 agsdg 1.23 7. 8.9 1sdljgl 6.66 7.8   "

    //正規表現を解釈する
    reg:= regexp.MustCompile(`\d+\.\d+`)
    if reg == nil {
        fmt.Println("MustCompile err")
        return
    }

    //キーの情報を取得する
    //result:= reg.FindAllString(buf, -1)
    result:= reg.FindAllStringSubmatch(buf, -1)
    fmt.Println("result = ", result)
} 

操作の結果は次のようになります。

result =  [[43.14] [1.23] [8.9] [6.66] [7.8]]

【例5】divタグ内の内容と一致させます。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    // ローラル文字列
    buf := `


<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>IT基礎 | Goチュートリアル</title>
</head>
<body>
    <div>Go紹介</div>
    <div>Go基礎</div>
</body>
</html>
    `

    // 正規表現を解釈
    reg := regexp.MustCompile(`<div>(?s:(.*?))</div>`)
    if reg == nil {
        fmt.Println("MustCompile err")
        return
    }

    // キー情報を抽出
    result := reg.FindAllStringSubmatch(buf, -1)

    // <>をフィルタする
    for _, text := range result {
        fmt.Println("text[1] = ", text[1])
    }
} 

[例6] CompileメソッドでRegexpオブジェクトを返し、関連する関数のマッチング、検索、置換を実現します。

package main
import (
    "fmt"
    "regexp"
    "strconv"
)
func main() {
    //目標文字列
    searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18"
    pat := "[0-9]+.[0-9]+"          //正規表現

    f := func(s string) string{
        v, _ := strconv.ParseFloat(s, 32)
        return strconv.FormatFloat(v * 2, 'f', 2, 32)
    }
    if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
        fmt.Println("一致するものがありました!")
    }
    re, _ := regexp.Compile(pat)
    //一致する部分を "##.#"に置換
    str := re.ReplaceAllString(searchIn, "##.#")
    fmt.Println(str)
    //関数をパラメータにする場合
    str2 := re.ReplaceAllStringFunc(searchIn, f)
    fmt.Println(str2)
} 

出力結果:

Match Found!
John: ##.# William: ##.# Steve: ##.#
John: 5156.68 William: 9134.46 Steve: 11264.36

上記のコードの Compile メソッドは正規表現を解析して返すことができます。正常に返された場合は、正規表現が正しく、テキストの一致に使用できることを意味します。

さらに、Compile メソッドと同様に正則化の有効性をチェックできる MustCompile メソッドを使用することもできますが、正則化が無効な場合、プログラムはパニックになります。

 

「 Go 言語の正規表現: regexp パッケージ」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】