ホームページ >バックエンド開発 >Golang >Go の正規表現で、ルックアラウンドなしでネガティブ マッチングを効果的に実行するにはどうすればよいですか?

Go の正規表現で、ルックアラウンドなしでネガティブ マッチングを効果的に実行するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-20 12:39:09465ブラウズ

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

Go 正規表現での否定一致

Go 正規表現では、ルックアラウンド構造がないため、特定の定数文字列を除くすべてを一致させるのが困難になる場合があります.

オリジナルRegExp:

指定された正規表現 /.*/.*/(.*) は、3 つのバックスラッシュの後のすべてに一致します。ただし、「somestring」を含む文字列は除外されません。

否定アプローチ

方法 1: Web サービス

1回避策には、POSIX 互換の否定パターンを生成する Web サービスを使用することが含まれます。 「somestring」の場合、.* を使用する代わりに、元の RegExp:

/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$

メソッド 2: Character Class

に置き換えることができる複雑なパターンが生成されます。 、次の式は否定文字クラス [^/] を使用します:

`[^/]+/[^/]+/(.*)`

これは、以下のものに一致します。 3 番目のバックスラッシュですが、「somestring」を含む文字列は除外されません。

キャプチャ グループを使用した回避策

RE2 (Go が使用する) は先読みをサポートしていないため、文字列の 3 つの部分すべてをキャプチャし、キャプチャ グループの抽出された値を確認できます。

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    if len(val) > 1 && val[1] != "somestring" {
        fmt.Println(val[1])
    } else {
        fmt.Println("No match")
    }
}

このアプローチ一致した値を取得し、「somestring」と一致しない場合はそれらを出力します。

以上がGo の正規表現で、ルックアラウンドなしでネガティブ マッチングを効果的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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