0

一部の文字列(「何とか」など)で(両側で)ドットで区切られた「親」のすべての出現を置き換えようとします。つまり、文字列の場合

$view.parent.parent.data.CurrentCategoryId, $view.parent.parent.data.CurrentFolderId

文字列が必要です

$view.blah.blah.data.CurrentCategoryId, $view.blah.blah.data.CurrentFolderId

私はコードでこれをやろうとします

content = Regex.Replace(content,
                                        "(?<preSymbol>[\\.^\"'])" + "parent" +
                                        "(?<postSymbol>[\\.$\"'])",
                                        m =>
                                        m.Groups["preSymbol"] + "blah" +
                                        m.Groups["postSymbol"]);

しかし得る

view.blah.parent.data.CurrentCategoryId, $view.blah.parent.data.CurrentFolderId

どうしたの?

4

1 に答える 1

2

parent間違っているのは、一致がオーバーラップできないため、キャプチャ グループが のすべてのインスタンスを置き換えることを妨げていることです。

ただし、できることは、ゼロ幅の一致を使用することです。つまり、一致にカウントされないものであり、そのためにはルックアラウンドが必要です。試す:

"(?<=[\\.^\"'])" + "parent" +
"(?=[\\.$\"'])",

(?<= ... )パターンの前に何かがあることを確認する肯定的な後読みです。

(?= ... )は正の先読みであり、パターンの後に何が含まれているかを確認します。

どちらも試合にはカウントされません。

ただし、パターンの解釈は完全には正しくありません。文字クラスでは、 と の両方が機能^$失います。以下を使用する必要があります。

"(?<=[\\.\"']|^)" + "parent" +
"(?=[\\.\"']|$)",

代わりに、文字列の最初と最後を意味します。これで、文字クラスでピリオドをエスケープする必要がなくなりました。

"(?<=[.\"']|^)" + "parent" +
"(?=[.\"']|$)",

blahまた、以外の文字parentが一致しなかったため、置換は単純になりました。

于 2013-10-05T17:10:43.507 に答える