ホームページ >バックエンド開発 >Golang >Go 言語の正規表現に関する高度なチュートリアル: ゼロ幅アサーションの使用方法

Go 言語の正規表現に関する高度なチュートリアル: ゼロ幅アサーションの使用方法

王林
王林オリジナル
2023-07-12 13:39:071534ブラウズ

Go 言語の正規表現に関する高度なチュートリアル: ゼロ幅アサーションの使用方法

正規表現は、文字列内の特定のパターンのテキストを検索して置換するために使用できる強力なテキスト マッチング ツールです。 。 Go 言語の正規表現ライブラリは、特定のシナリオで非常に役立つゼロ幅アサーションなどの豊富な機能を提供します。この記事では、Go 言語でゼロ幅アサーションを使用して正規表現の柔軟性を向上させる方法を紹介します。

ゼロ幅アサーションは、文字を消費せずにサブパターン (または部分文字列) の位置を確認するために使用される特別な正規表現です。これは、テキスト自体を返さずに、特定の条件に一致するテキストを検索するのに役立ちます。 Go 言語では、ゼロ幅アサーションには、正のゼロ幅アサーション、負のゼロ幅アサーション、正のゼロ幅アサーション非キャプチャ グループ、および負のゼロ幅アサーション非キャプチャ グループの 4 種類があります。

Positive Lookahead アサーションは、特定の位置の背後に現れる特定のパターンを持つテキストを検索するために使用されます。その構文は (?=...) で、... は一致する必要があるパターンを表します。以下に例を示します。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "123abc456"
    pattern := `d(?=abc)`  // 匹配数字后面紧跟着"abc"的情况
    re := regexp.MustCompile(pattern)
    results := re.FindAllString(str, -1)
    fmt.Println(results)  // 输出:[1]
}

上記の例で照合したいのは、数字の後に「abc」、つまり数字「1」が続く場合です。ここでは前方ゼロ幅アサーションが使用されており、一致が成功した後に返される結果は数値「1」です。

負のゼロ幅アサーション (Negative Lookahead Assertion) は、特定の位置以降の特定のパターンに現れないテキストを検索します。その構文は (?!...) で、... は除外する必要があるパターンを表します。以下に例を示します。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "123abc456"
    pattern := `d(?!abc)`  // 匹配数字后面不跟着"abc"的情况
    re := regexp.MustCompile(pattern)
    results := re.FindAllString(str, -1)
    fmt.Println(results)  // 输出:[2 3]
}

上記の例で照合したいのは、数字の後に「abc」が続かない場合、つまり数字「2」と「3」です。ここでは負のゼロ幅アサーションが使用されており、一致が成功した後に返される結果は数値「2」と「3」です。

正のゼロ幅アサーション非キャプチャ グループ (Positive Lookahead Non-Capturing Group) と負のゼロ幅アサーション非キャプチャ グループ (Negative Lookahead Non-Capturing Group) は、構文が異なることを除き、同様に使用されます。 require (...) の外側に ?= または ?! を追加します。以下に例を示します。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "abc123xyz"
    pattern := `(?i:[a-z]+(?=d))`  // 匹配小写字母后面紧跟着数字的情况
    re := regexp.MustCompile(pattern)
    results := re.FindAllString(str, -1)
    fmt.Println(results)  // 输出:[abc]
}

上記の例では、小文字の後に数字が続く場合、つまり「abc」を照合する必要があります。ここでは、前方ゼロ幅アサーション非キャプチャ グループが使用されており、一致が成功した後に返される結果は「abc」です。

非キャプチャ グループの負のゼロ幅アサーションでも、構文 (?i:...) を使用します。(...) で除外する必要があることを追加するだけです。 モード。以下に例を示します。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "abc123XYZ"
    pattern := `(?i:[a-z]+(?!123))`  // 匹配小写字母后面不跟着"123"的情况
    re := regexp.MustCompile(pattern)
    results := re.FindAllString(str, -1)
    fmt.Println(results)  // 输出:[abc]
}

上記の例で照合したいのは、小文字の後に「123」が続かない場合、つまり「abc」です。ここでは、負のゼロ幅アサーション非キャプチャ グループが使用されており、一致が成功した後に返される結果は「abc」です。

ゼロ幅アサーションを使用すると、正規表現の機能を拡張して、より正確なテキスト マッチングを実現できます。正規表現を使用する場合、ゼロ幅アサーションを適切に使用するとコードを節約し、マッチング効率を向上させることができます。この記事が、Go 言語の正規表現によるゼロ幅アサーションの理解と使用に役立つことを願っています。

以上がGo 言語の正規表現に関する高度なチュートリアル: ゼロ幅アサーションの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。