ホームページ >バックエンド開発 >Golang >Go 正規表現で負の後読みをシミュレートするにはどうすればよいですか?

Go 正規表現で負の後読みをシミュレートするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-29 12:59:10758ブラウズ

How Can I Simulate Negative Lookbehind in Go Regular Expressions?

Go での負の後読みシミュレーション

Go では、パフォーマンス上の理由から、負の後読みアサーションはサポートされていません。これは、後読み演算子を使用してパターンを照合しようとするときに問題が発生する可能性があります。

たとえば、セット [@#/] から先頭の文字を除外して、文字列からコマンドを抽出するために負の後読みが使用される可能性があります。否定後読みアサーションの使用:

\b(?<![@#\/])\w.*

ただし、否定後読みがサポートされていないため、この正規表現は Go ではコンパイルされません。

代替アプローチ

代わりに、否定的な後読みを否定された文字セットに置き換えることができます。これは、一致しない文字に一致します。

更新された正規表現:

\b[^@#/]\w.*

セットの先頭文字 [@#/] が文字列の先頭で許可されている場合、次のことができます。 ^ アンカーを使用します:

(?:^|[^@#\/])\b\w.*

フィルターFunction

あるいは、Go のフィルター関数を使用して、セット [@#/] の文字で始まる文字列をフィルターで除外することもできます。

func Filter(vs []string, f func(string) bool) []string {
    vsf := make([]string, 0)
    for _, v := range vs {
        if f(v) {
            vsf = append(vsf, v)
        }
    }
    return vsf
}

プロセスFunction

フィルターを利用した処理関数を作成することもできます。 function:

func Process(inp string) string {
    t := strings.Split(inp, " ")
    t = Filter(t, func(x string) bool {
        return strings.Index(x, "#") != 0 &&
               strings.Index(x, "@") != 0 &&
               strings.Index(x, "/") != 0
    })
    return strings.Join(t, " ")
}

この処理関数は、セット [@#/] から文字で始まる単語を削除して、入力文字列を変換するために使用できます。

以上がGo 正規表現で負の後読みをシミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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