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 サイトの他の関連記事を参照してください。