Go 正規表現: 特定の文字列の除外
Go では、regexp パッケージを使用して特定の定数文字列以外のものを一致させようとすると、問題が発生する場合があります。 。 Go 正規表現の構文が制限されているため、先読みを伴う推奨ソリューションの多くは適用できませんが、代替アプローチが利用可能です。
回避策 1: 否定パターン ジェネレーターを使用する
Go 正規表現以降は先読みをサポートしていません。次のような外部サービスの使用を検討してください。 http://www.formauri.es/personal/pgimeno/misc/non-match-regex で否定パターンを生成します。たとえば、「somestring」の否定パターンは次のとおりです。
$ ^([^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?)?)?))?)?$
この否定パターンを元の正規表現で使用するには、最後の (.*) を <^ の後の部分> に置き換えます。その結果、次のようになります。次のようなパターン:
/[^/]*/[^/]*/(([^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?)?)?))?)?)$
または、[^/] パターンを使用して、/ 以外の 0 個以上の文字と一致させることもできます。 of .*.
回避策 2: すべてのセクションをキャプチャして値を確認する
先読みは使用できませんが、パターンの 3 つの部分すべてをキャプチャして値を確認することはできます。最初のキャプチャ グループの値を使用して、キャプチャされた値を使用するか、一致しないことを報告するかを決定します:
package main 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") } }
以上がGo Regex を使用するときに特定の文字列を除外するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。