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 メソッドを使用することもできますが、正則化が無効な場合、プログラムはパニックになります。