Documentation
¶
Overview ¶
Package regexpは正規表現の検索を実装します。
受け入れる正規表現の構文は、Perl、Python、および他の言語で使用される一般的な構文です。 より正確には、RE2が受け入れる構文であり、以下で説明されています。 https://golang.org/s/re2syntax(\Cを除く) 構文の概要については、次を実行してください。
go doc regexp/syntax
このパッケージによって提供される正規表現の実装は、入力のサイズに比例して線形の時間で実行されることが保証されています。 (これは、ほとんどのオープンソースの正規表現の実装が保証していない特性です。)この特性の詳細については、次を参照してください。
https://swtch.com/~rsc/regexp/regexp1.html
またはオートマトン理論に関する書籍を参照してください。
すべての文字はUTF-8でエンコードされたコードポイントです。 utf8.DecodeRuneに従って、無効なUTF-8シーケンスの各バイトは、utf8.RuneError(U+FFFD)としてエンコードされたものとして扱われます。
正規表現に一致し、一致したテキストを識別するRegexpの16個のメソッドがあります。 これらのメソッドの名前は、次の正規表現と一致します。
Find(All)?(String)?(Submatch)?(Index)?
'All'が存在する場合、このルーチンは表現全体の連続する重複しない一致を見つけます。直前の一致と隣接する空の一致は無視されます。戻り値は、対応する非-'All'ルーチンの連続する戻り値を含むスライスです。これらのルーチンは、追加の整数引数nを受け取ります。ただし、n >= 0の場合、関数は最大n個の一致/サブマッチを返し、それ以外の場合はすべてを返します。
'String'が存在する場合、引数は文字列です。それ以外の場合はバイトのスライスです。返り値は適切に調整されます。
'Submatch'が存在する場合、返り値は式の連続するサブマッチを識別するスライスです。サブマッチは、正規表現内のパレンセシスで囲まれたサブ式(キャプチャグループとも呼ばれる)の一致です。左から右にかけて開くかっこの順に番号が付けられています。サブマッチ0は式全体の一致であり、サブマッチ1は最初のカッコで囲まれた部分式の一致です。
'Index'が存在する場合、一致とサブマッチは入力文字列内のバイトインデックスのペアで識別されます。 result[2*n:2*n+2]はn番目のサブマッチのインデックスを識別します。n==0の場合のペアは、式全体の一致を識別します。'Index'が存在しない場合、一致/サブマッチのテキストで識別されます。 インデックスが負数であるか、テキストがnilの場合、サブ式は入力文字列内で一致するテキストがないことを意味します。 'String'バージョンでは、空の文字列は一致がないか空の一致を意味します。
RuneReaderから読み取られるテキストに適用できるメソッドのサブセットもあります:
MatchReader、FindReaderIndex、FindReaderSubmatchIndex ¶
このセットは増える可能性があります。正規表現の一致では、一致のために返されるテキストを超えたテキストを調べる必要がある場合があるため、RuneReaderからテキストを一致させるメソッドは、返される前に任意の深さまで入力を読み込む可能性があります。
(このパターンに一致しないいくつかの他のメソッドもあります。)
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { // 式を一度だけコンパイルする。通常は初期化時に行う。 // バックスラッシュを引用符で囲まないために、生文字列を使用する。 var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`) fmt.Println(validID.MatchString("adam[23]")) fmt.Println(validID.MatchString("eve[7]")) fmt.Println(validID.MatchString("Job[48]")) fmt.Println(validID.MatchString("snakey")) }
Output: true true false false
Index ¶
- func Match(pattern string, b []byte) (matched bool, err error)
- func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
- func MatchString(pattern string, s string) (matched bool, err error)
- func QuoteMeta(s string) string
- type Regexp
- func (re *Regexp) Copy() *Regexp
- func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte
- func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte
- func (re *Regexp) Find(b []byte) []byte
- func (re *Regexp) FindAll(b []byte, n int) [][]byte
- func (re *Regexp) FindAllIndex(b []byte, n int) [][]int
- func (re *Regexp) FindAllString(s string, n int) []string
- func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
- func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
- func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
- func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte
- func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int
- func (re *Regexp) FindIndex(b []byte) (loc []int)
- func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int)
- func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int
- func (re *Regexp) FindString(s string) string
- func (re *Regexp) FindStringIndex(s string) (loc []int)
- func (re *Regexp) FindStringSubmatch(s string) []string
- func (re *Regexp) FindStringSubmatchIndex(s string) []int
- func (re *Regexp) FindSubmatch(b []byte) [][]byte
- func (re *Regexp) FindSubmatchIndex(b []byte) []int
- func (re *Regexp) LiteralPrefix() (prefix string, complete bool)
- func (re *Regexp) Longest()
- func (re *Regexp) MarshalText() ([]byte, error)
- func (re *Regexp) Match(b []byte) bool
- func (re *Regexp) MatchReader(r io.RuneReader) bool
- func (re *Regexp) MatchString(s string) bool
- func (re *Regexp) NumSubexp() int
- func (re *Regexp) ReplaceAll(src, repl []byte) []byte
- func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
- func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte
- func (re *Regexp) ReplaceAllLiteralString(src, repl string) string
- func (re *Regexp) ReplaceAllString(src, repl string) string
- func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
- func (re *Regexp) Split(s string, n int) []string
- func (re *Regexp) String() string
- func (re *Regexp) SubexpIndex(name string) int
- func (re *Regexp) SubexpNames() []string
- func (re *Regexp) UnmarshalText(text []byte) error
Examples ¶
- Package
- Match
- MatchString
- QuoteMeta
- Regexp.Expand
- Regexp.ExpandString
- Regexp.Find
- Regexp.FindAll
- Regexp.FindAllIndex
- Regexp.FindAllString
- Regexp.FindAllStringSubmatch
- Regexp.FindAllStringSubmatchIndex
- Regexp.FindAllSubmatch
- Regexp.FindAllSubmatchIndex
- Regexp.FindIndex
- Regexp.FindString
- Regexp.FindStringIndex
- Regexp.FindStringSubmatch
- Regexp.FindSubmatch
- Regexp.FindSubmatchIndex
- Regexp.Longest
- Regexp.Match
- Regexp.MatchString
- Regexp.NumSubexp
- Regexp.ReplaceAll
- Regexp.ReplaceAllLiteralString
- Regexp.ReplaceAllString
- Regexp.ReplaceAllStringFunc
- Regexp.Split
- Regexp.SubexpIndex
- Regexp.SubexpNames
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Match ¶
Matchは、バイトスライス b が正規表現パターンのいずれかに一致するかどうかを報告します。 より複雑なクエリには、Compileと完全なRegexpインターフェースを使用する必要があります。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { matched, err := regexp.Match(`foo.*`, []byte(`seafood`)) fmt.Println(matched, err) matched, err = regexp.Match(`bar.*`, []byte(`seafood`)) fmt.Println(matched, err) matched, err = regexp.Match(`a(b`, []byte(`seafood`)) fmt.Println(matched, err) }
Output: true <nil> false <nil> false error parsing regexp: missing closing ): `a(b`
func MatchReader ¶
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
MatchReaderは、RuneReaderによって返されるテキストに正規表現パターンの一致があるかどうかを報告します。 より複雑なクエリにはCompileと完全なRegexpインターフェイスを使用する必要があります。
func MatchString ¶
MatchStringは、文字列sが正規表現パターンに一致するものを含んでいるかどうかを報告します。 より複雑なクエリを行う場合は、Compileと完全なRegexpインターフェースを使用する必要があります。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { matched, err := regexp.MatchString(`foo.*`, "seafood") fmt.Println(matched, err) matched, err = regexp.MatchString(`bar.*`, "seafood") fmt.Println(matched, err) matched, err = regexp.MatchString(`a(b`, "seafood") fmt.Println(matched, err) }
Output: true <nil> false <nil> false error parsing regexp: missing closing ): `a(b`
func QuoteMeta ¶
QuoteMetaは、引数のテキスト内のすべての正規表現メタ文字をエスケープした文字列を返します。返された文字列は、リテラルテキストにマッチする正規表現です。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { fmt.Println(regexp.QuoteMeta(`Escaping symbols like: .+*?()|[]{}^$`)) }
Output: Escaping symbols like: \.\+\*\?\(\)\|\[\]\{\}\^\$
Types ¶
type Regexp ¶
type Regexp struct {
// contains filtered or unexported fields
}
Regexpはコンパイルされた正規表現の表現です。 RegexpはLongestなどの構成方法を除いて、複数のゴルーチンによる並行利用に安全です。
func Compile ¶
Compileは正規表現をパースし、成功した場合には、 テキストと照合するために使用できるRegexpオブジェクトを返します。
テキストと照合する際、正規表現は入力のなるべく早い位置(最も左端)から一致し、 その中からバックトラック検索が最初に見つけたものを選択します。 これを左端優先マッチングと呼びますが、 これはPerl、Pythonなどの実装と同じセマンティクスです。 ただし、このパッケージはバックトラックのコストなしで実装されています。 POSIXの左端最長一致マッチングについては、CompilePOSIXを参照してください。
func CompilePOSIX ¶
CompilePOSIXはCompileと同様ですが、正規表現をPOSIX ERE(egrep)構文に制限し、マッチのセマンティクスをleftmost-longestに変更します。 つまり、テキストに対してマッチングする際に、正規表現は入力(最も左側)で可能な限り早く開始するマッチを返し、その中でも可能な限り長いマッチを選択します。 このleftmost-longestマッチングと呼ばれる手法は、かつての正規表現の実装やPOSIXが指定するセマンティクスと同じです。 ただし、複数のleftmost-longestマッチが存在する場合、このパッケージはPOSIXとは異なる方法を採用します。 可能なleftmost-longestマッチの中から、このパッケージはバックトラッキング検索で最初に見つかるマッチを選択します。一方、POSIXでは最初のサブエクスプレッション、次に2番目のサブエクスプレッション、以降左から右へと長さを最大化するマッチを選択すると規定されています。 POSIXのルールは計算上の制約があり、定義もされていません。 詳細については、https://swtch.com/~rsc/regexp/regexp2.html#posixを参照してください。
func MustCompile ¶
MustCompileはCompileと似ていますが、式を解析できない場合はパニックします。 これにより、コンパイルされた正規表現を保持するグローバル変数の安全な初期化が簡素化されます。
func MustCompilePOSIX ¶
MustCompilePOSIXは、CompilePOSIXと似ていますが、式が解析できない場合にはpanicを発生させます。 これにより、コンパイルされた正規表現を保持するグローバル変数の安全な初期化を簡素化します。
func (*Regexp) Copy ¶ added in v1.6.0
Copyは、reからコピーされた新しいRegexpオブジェクトを返します。 コピーを使用してLongestを呼び出しても他のコピーに影響を与えません。
廃止予定: 以前のリリースでは、複数のゴルーチンでRegexpを使用する場合、 各ゴルーチンに独自のコピーを与えることでロック競合を回避できました。 Go 1.12以降は、ロック競合を回避するためにCopyを使用する必要はありません。 Copyは、異なるLongest設定で2つのコピーを作成する必要がある場合には依然適切かもしれません。
func (*Regexp) Expand ¶
Expandはテンプレートをdstに追加し、結果を返します。追加の過程で、Expandはテンプレート内の変数をsrcから引っ張った対応する一致で置き換えます。一致スライスはFindSubmatchIndexによって返されるべきです。 テンプレート中では、変数は$nameまたは${name}の形式の部分文字列で示されます。nameは非空の文字、数字、アンダースコアの連続です。$1のような純粋な数字の名前は、対応するインデックスのサブマッチを参照します。その他の名前は、(?P<name>...)構文で名前付きのキャプチャ括弧を参照します。範囲外またはマッチしないインデックスの参照または正規表現に存在しない名前は、空のスライスで置き換えられます。 $name形式では、nameは可能な限り長くなります:$1xは${1x}ではなく${1}xと等価です。また、$10は${10}ではなく${1}0と等価です。 出力にリテラルの$を挿入するには、テンプレートで$$を使用してください。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { content := []byte(` # comment line option1: value1 option2: value2 # another comment line option3: value3 `) // 正規表現パターンは、コンテンツから「key: value」のペアをキャプチャします。 pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`) // 正規表現パターンでキャプチャされた値を参照して、 // "key: value"を "key=value"に変換するためのテンプレート。 template := []byte("$key=$value\n") result := []byte{} // 内容における正規表現の各マッチについて。 for _, submatches := range pattern.FindAllSubmatchIndex(content, -1) { // キャプチャされたサブマッチをテンプレートに適用し、出力を結果に追加します。 result = pattern.Expand(result, template, content, submatches) } fmt.Println(string(result)) }
Output: option1=value1 option2=value2 option3=value3
func (*Regexp) ExpandString ¶
ExpandStringは、Expandと同様にテンプレートとソースが文字列の場合に使用します。 割り当てに対する制御を呼び出し元のコードに提供するために、バイトスライスに追加して返します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { content := ` # comment line option1: value1 option2: value2 # another comment line option3: value3 ` // 正規表現パターンは、コンテンツから "key: value" のペアをキャプチャします。 pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`) // 正規表現パターンによってキャプチャされた値を参照して、 // "key: value"を "key=value" に変換するためのテンプレート。 template := "$key=$value\n" result := []byte{} for _, submatches := range pattern.FindAllStringSubmatchIndex(content, -1) { // キャプチャされたサブマッチをテンプレートに適用し、出力を結果に追加します。 result = pattern.ExpandString(result, template, content, submatches) } fmt.Println(string(result)) }
Output: option1=value1 option2=value2 option3=value3
func (*Regexp) Find ¶
Findは正規表現に一致する最も左側のテキストを含むスライスを返します。 nilの返り値は一致なしを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo.?`) fmt.Printf("%q\n", re.Find([]byte(`seafood fool`))) }
Output: "food"
func (*Regexp) FindAll ¶
FindAllはFindの 'All' バージョンであり、パッケージコメントで定義されている 'All' の説明に従って、 式の全ての連続するマッチのスライスを返します。 nilの返り値はマッチがないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo.?`) fmt.Printf("%q\n", re.FindAll([]byte(`seafood fool`), -1)) }
Output: ["food" "fool"]
func (*Regexp) FindAllIndex ¶
FindAllIndexはFindIndexの「All」バージョンであり、 パッケージコメントで定義されている「All」の説明に従って、 式のすべての連続する一致のスライスを返します。 nilの返り値は一致がないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { content := []byte("London") re := regexp.MustCompile(`o.`) fmt.Println(re.FindAllIndex(content, 1)) fmt.Println(re.FindAllIndex(content, -1)) }
Output: [[1 3]] [[1 3] [4 6]]
func (*Regexp) FindAllString ¶
FindAllStringはFindStringの'All'バージョンです。式によって定義されるように、 'All'の説明に従って、連続する全ての一致する部分文字列のスライスを返します。 nilの返り値は一致なしを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a.`) fmt.Println(re.FindAllString("paranormal", -1)) fmt.Println(re.FindAllString("paranormal", 2)) fmt.Println(re.FindAllString("graal", -1)) fmt.Println(re.FindAllString("none", -1)) }
Output: [ar an al] [ar an] [aa] []
func (*Regexp) FindAllStringIndex ¶
FindAllStringIndexはFindStringIndexの「All」バージョンです。式によって定義されるすべての連続したマッチのスライスを返します。「All」の説明によってパッケージのコメントで定義されます。 nilの返り値はマッチがないことを示します。
func (*Regexp) FindAllStringSubmatch ¶
FindAllStringSubmatchは、FindStringSubmatchの「All」バージョンであり、式によって定義されたすべての連続した一致のスライスを返します。パッケージコメントの「All」の説明に従います。 nilの戻り値は一致がないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-axb-", -1)) fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-ab-", -1)) }
Output: [["ab" ""]] [["axxb" "xx"]] [["ab" ""] ["axb" "x"]] [["axxb" "xx"] ["ab" ""]]
func (*Regexp) FindAllStringSubmatchIndex ¶
FindAllStringSubmatchIndexはFindStringSubmatchIndexのバージョンであり、 式によって定義されるすべての連続した一致のスライスを返します。 パッケージコメントの「All」の説明で定義されているように、 nilの戻り値は一致がないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) // インデックス: // 01234567 012345678 // -ab-axb- -axxb-ab- fmt.Println(re.FindAllStringSubmatchIndex("-ab-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-axxb-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-ab-axb-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-axxb-ab-", -1)) fmt.Println(re.FindAllStringSubmatchIndex("-foo-", -1)) }
Output: [[1 3 2 2]] [[1 5 2 4]] [[1 3 2 2] [4 7 5 6]] [[1 5 2 4] [6 8 7 7]] []
func (*Regexp) FindAllSubmatch ¶
FindAllSubmatchは、FindSubmatchの 'All' バージョンです。この関数は、'All' 説明によって定義された通り、式に連続するすべての一致部分をスライスとして返します。 nilの返り値は、マッチが見つからなかったことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo(.?)`) fmt.Printf("%q\n", re.FindAllSubmatch([]byte(`seafood fool`), -1)) }
Output: [["food" "d"] ["fool" "l"]]
func (*Regexp) FindAllSubmatchIndex ¶
FindAllSubmatchIndexはFindSubmatchIndexの'All'バージョンであり、 パッケージコメントの'All'の説明に従って、式に対するすべての連続した一致結果のスライスを返します。 nilの返り値は一致なしを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { content := []byte(` # comment line option1: value1 option2: value2 `) // 正規表現パターンはコンテンツから "key: value" のペアをキャプチャします。 pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`) allIndexes := pattern.FindAllSubmatchIndex(content, -1) for _, loc := range allIndexes { fmt.Println(loc) fmt.Println(string(content[loc[0]:loc[1]])) fmt.Println(string(content[loc[2]:loc[3]])) fmt.Println(string(content[loc[4]:loc[5]])) } }
Output: [18 33 18 25 27 33] option1: value1 option1 value1 [35 50 35 42 44 50] option2: value2 option2 value2
func (*Regexp) FindIndex ¶
FindIndexは、正規表現の一致する最も左側の箇所を示す整数の2要素スライスを返します。一致部分はb[loc[0]:loc[1]]にあります。 nilを返す場合は一致なしを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { content := []byte(` # comment line option1: value1 option2: value2 `) // 正規表現パターンは、コンテンツから「キー: 値」のペアをキャプチャします。 pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`) loc := pattern.FindIndex(content) fmt.Println(loc) fmt.Println(string(content[loc[0]:loc[1]])) }
Output: [18 33] option1: value1
func (*Regexp) FindReaderIndex ¶
func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int)
FindReaderIndexは、RuneReaderから読み込まれたテキスト内で正規表現の最左一致の位置を示す整数の2要素スライスを返します。マッチしたテキストは、入力ストリームのバイトオフセットloc[0]からloc[1]-1までで見つかりました。 nilの戻り値は一致がないことを示します。
func (*Regexp) FindReaderSubmatchIndex ¶
func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int
FindReaderSubmatchIndexは、RuneReaderによって読み取られたテキストの正規表現の最も左の一致と、そのサブエクスプレッションの一致(ある場合)を識別するインデックスのペアを保持するスライスを返します。パッケージコメントの'Submatch'と'Index'の説明で定義されています。nilの返り値は一致がないことを示します。
func (*Regexp) FindString ¶
FindStringは、正規表現の左端と一致する最初のテキストを保持する文字列を返します。 一致がない場合、返り値は空の文字列になりますが、正規表現が空の文字列と一致する場合も同様に空になります。 これらのケースを区別する必要がある場合は、FindStringIndexまたはFindStringSubmatchを使用してください。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo.?`) fmt.Printf("%q\n", re.FindString("seafood fool")) fmt.Printf("%q\n", re.FindString("meat")) }
Output: "food" ""
func (*Regexp) FindStringIndex ¶
FindStringIndexは、正規表現のsにおける最も左にマッチする部分の位置を定義する、整数の2要素のスライスを返します。マッチはs[loc[0]:loc[1]]にあります。 nilの返り値は、マッチが見つからなかったことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`ab?`) fmt.Println(re.FindStringIndex("tablett")) fmt.Println(re.FindStringIndex("foo") == nil) }
Output: [1 3] true
func (*Regexp) FindStringSubmatch ¶
FindStringSubmatchは、正規表現の最も左にマッチするテキストと、そのサブエクスプレッションにマッチするテキスト(あれば)を保持する文字列のスライスを返します。パッケージのコメントにある'Submatch'の説明によって定義されます。 nilの返り値は、マッチがないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b(y|z)c`) fmt.Printf("%q\n", re.FindStringSubmatch("-axxxbyc-")) fmt.Printf("%q\n", re.FindStringSubmatch("-abzc-")) }
Output: ["axxxbyc" "xxx" "y"] ["abzc" "" "z"]
func (*Regexp) FindStringSubmatchIndex ¶
FindStringSubmatchIndexは、正規表現の最も左にある一致と、 パッケージコメントで定義された'Submatch'および'Index'の説明によって決まる、 サブ式の一致(ある場合)を特定するインデックスのペアを保持するスライスを返します。 nilの返り値は一致なしを示します。
func (*Regexp) FindSubmatch ¶
FindSubmatchは、正規表現でb内で最も左にマッチするテキストと、そのサブエクスプレッション('Submatch'のパッケージの説明による)のマッチ(あれば)を保持するスライスのスライスを返します。 nilの戻り値は、マッチがないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo(.?)`) fmt.Printf("%q\n", re.FindSubmatch([]byte(`seafood fool`))) }
Output: ["food" "d"]
func (*Regexp) FindSubmatchIndex ¶
FindSubmatchIndexは、正規表現の最も左側の一致と、'Submatch'および'Index'の説明で定義される、必要に応じてそのサブ式のマッチを示すインデックスのペアを保持するスライスを返します。 nilの返り値は、一致が見つからないことを示します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) // インデックス: // 01234567 012345678 // -ab-axb- -axxb-ab- fmt.Println(re.FindSubmatchIndex([]byte("-ab-"))) fmt.Println(re.FindSubmatchIndex([]byte("-axxb-"))) fmt.Println(re.FindSubmatchIndex([]byte("-ab-axb-"))) fmt.Println(re.FindSubmatchIndex([]byte("-axxb-ab-"))) fmt.Println(re.FindSubmatchIndex([]byte("-foo-"))) }
Output: [1 3 2 2] [1 5 2 4] [1 3 2 2] [1 5 2 4] []
func (*Regexp) LiteralPrefix ¶
LiteralPrefixは、正規表現reの一致の開始部分である必要があるリテラル文字列を返します。もしリテラル文字列が正規表現全体を構成している場合、真を返します。
func (*Regexp) Longest ¶ added in v1.1.0
func (re *Regexp) Longest()
Longestは将来の検索において、最も左にある最長一致を優先します。 つまり、テキストに対して一致を探す場合、正規表現はできるだけ早く入力の最初に一致するものを返し、その中から最長の一致を選択します。 このメソッドはRegexpを修正するため、他のメソッドと同時に呼び出すことはできません。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(|b)`) fmt.Println(re.FindString("ab")) re.Longest() fmt.Println(re.FindString("ab")) }
Output: a ab
func (*Regexp) MarshalText ¶ added in v1.21.0
MarshalTextは[encoding.TextMarshaler]を実装します。出力は [Regexp.String]メソッドを呼び出した場合と一致します。
注意:このメソッドはいくつかの場合において情報の損失があります。POSIX 正規表現(つまり、[CompilePOSIX]を呼び出してコンパイルされたもの)や、 [Regexp.Longest]メソッドが呼び出された正規表現については示しません。
func (*Regexp) Match ¶
Matchは、バイトスライスbに正規表現reの一致が含まれているかどうかを報告します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`foo.?`) fmt.Println(re.Match([]byte(`seafood fool`))) fmt.Println(re.Match([]byte(`something else`))) }
Output: true false
func (*Regexp) MatchReader ¶
func (re *Regexp) MatchReader(r io.RuneReader) bool
MatchReaderはRuneReaderが返すテキストに、正規表現reの一致が含まれているかどうかを報告します。
func (*Regexp) MatchString ¶
MatchStringは文字列sに正規表現reの一致があるかどうかを報告します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`(gopher){2}`) fmt.Println(re.MatchString("gopher")) fmt.Println(re.MatchString("gophergopher")) fmt.Println(re.MatchString("gophergophergopher")) }
Output: false true true
func (*Regexp) NumSubexp ¶
NumSubexpはこのRegexp内のカッコで囲まれたサブ式の数を返します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re0 := regexp.MustCompile(`a.`) fmt.Printf("%d\n", re0.NumSubexp()) re := regexp.MustCompile(`(.*)((a)b)(.*)a`) fmt.Println(re.NumSubexp()) }
Output: 0 4
func (*Regexp) ReplaceAll ¶
ReplaceAllは、Regexpの一致した箇所を置換テキストreplで置き換えたsrcのコピーを返します。repl内の$記号はExpandと同様に解釈されます。つまり、$1は最初のサブマッチのテキストを表します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("T"))) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1"))) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W"))) fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W"))) }
Output: -T-T- --xx- --- -W-xxW-
func (*Regexp) ReplaceAllFunc ¶
ReplaceAllFuncは、Regexpのすべての一致箇所を、 マッチしたバイトスライスに対して適用した関数replの戻り値で置換したsrcのコピーを返します。 replによって返される置換は、Expandを使用せずに直接代入されます。
func (*Regexp) ReplaceAllLiteral ¶
ReplaceAllLiteralは、Regexpの一致する箇所を置換バイトreplで置換したsrcのコピーを返します。置換replは、Expandを使用せずに直接代入されます。
func (*Regexp) ReplaceAllLiteralString ¶
ReplaceAllLiteralStringはsrcのコピーを返し、Regexpの一致部分を置換文字列replで置き換えます。置換replは直接代入され、Expandを使用しません。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "T")) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "$1")) fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "${1}")) }
Output: -T-T- -$1-$1- -${1}-${1}-
func (*Regexp) ReplaceAllString ¶
ReplaceAllStringは、srcの正規表現にマッチする箇所を置換文字列replで置き換えたsrcのコピーを返します。repl内では、Expandと同様に$記号が解釈されます。例えば、$1は最初のサブマッチのテキストを表します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`a(x*)b`) fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W")) fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W")) }
Output: -T-T- --xx- --- -W-xxW-
func (*Regexp) ReplaceAllStringFunc ¶
ReplaceAllStringFuncは、srcのすべての正規表現の一致箇所を、関数replが適用された一致した部分文字列の返り値に置き換えたコピーを返します。replによって返される置換文字列は、Expandを使用せずに直接代入されます。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" "github.com/shogo82148/std/strings" ) func main() { re := regexp.MustCompile(`[^aeiou]`) fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper)) }
Output: SeaFooD FooL
func (*Regexp) Split ¶ added in v1.1.0
Splitメソッドは、文字列sを指定の表現によって区切り、それらの表現にマッチする部分文字列のスライスを返します。
このメソッドによって返されるスライスは、sのうちFindAllStringで返されるスライスに含まれていない 全ての部分文字列からなります。メタ文字を含まない表現に対しては、strings.SplitNと同等の動作になります。
例:
s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5) // s: ["", "b", "b", "c", "cadaaae"]
countパラメータによって返す部分文字列の数が決まります:
n > 0: 最大でn個の部分文字列を返します。最後の部分文字列は分割されなかった残りの部分です。 n == 0: 結果はnil(部分文字列なし)です。 n < 0: 全ての部分文字列を返します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { a := regexp.MustCompile(`a`) fmt.Println(a.Split("banana", -1)) fmt.Println(a.Split("banana", 0)) fmt.Println(a.Split("banana", 1)) fmt.Println(a.Split("banana", 2)) zp := regexp.MustCompile(`z+`) fmt.Println(zp.Split("pizza", -1)) fmt.Println(zp.Split("pizza", 0)) fmt.Println(zp.Split("pizza", 1)) fmt.Println(zp.Split("pizza", 2)) }
Output: [b n n ] [] [banana] [b nana] [pi a] [] [pizza] [pi a]
func (*Regexp) SubexpIndex ¶ added in v1.15.0
SubexpIndexは指定された名前を持つ最初のサブ式のインデックスを返します。 もし指定した名前のサブ式が存在しない場合は-1を返します。
複数のサブ式は同じ名前で書くこともできます。たとえば、(?P<bob>a+)(?P<bob>b+)のように、 "bob"という名前で2つのサブ式を宣言することができます。 この場合、SubexpIndexは正規表現内で最も左にあるサブ式のインデックスを返します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)`) fmt.Println(re.MatchString("Alan Turing")) matches := re.FindStringSubmatch("Alan Turing") lastIndex := re.SubexpIndex("last") fmt.Printf("last => %d\n", lastIndex) fmt.Println(matches[lastIndex]) }
Output: true last => 2 Turing
func (*Regexp) SubexpNames ¶
SubexpNamesはこの正規表現の括弧付きの部分式の名前を返します。 最初の部分式の名前はnames[1]ですので、mがマッチスライスである場合、m[i]の名前はSubexpNames()[i]です。 正規表現全体には名前を付けることができないため、names[0]は常に空の文字列です。 スライスは変更しないでください。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/regexp" ) func main() { re := regexp.MustCompile(`(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)`) fmt.Println(re.MatchString("Alan Turing")) fmt.Printf("%q\n", re.SubexpNames()) reversed := fmt.Sprintf("${%s} ${%s}", re.SubexpNames()[2], re.SubexpNames()[1]) fmt.Println(reversed) fmt.Println(re.ReplaceAllString("Alan Turing", reversed)) }
Output: true ["" "first" "last"] ${last} ${first} Turing Alan
func (*Regexp) UnmarshalText ¶ added in v1.21.0
UnmarshalTextは、エンコードされた値に対して[Compile]を呼び出すことで、[encoding.TextUnmarshaler]を実装します。