-2

特定の状況で別のドメインを指すようにURLを書き換えるASP.NET応答フィルターに取り組んでいます。

ASP.NETは応答の書き込みをチャンク化するため、ページが完全にストリーミングされる前に、フィルターが数回呼び出されます。これは、Regex.Replaceを呼び出すたびにURLが二重に置き換えられないように注意する必要があることを意味します(最終的にはhttp://foo.comhttp://foo.com/pathになります)。

これを行うために、置換にネガティブルックビハインド式を使用しようとしていますが、機能していないようです。

    content = Regex.Replace(content,"((?<!" + newDomain + ")" + match + ")", newDomain + match); 

これにより、次のような正規表現が作成されます。

 ((?<!http://www.foo.com/)actual/url)

しかし、それは後ろ姿を尊重していないようで、私はすべてを二重に交換しています。

何か案は?

編集:この正規表現は、RegexCoachなどのツールを使用してサンプルデータに対してテストするときにうまく機能します。

編集2:スラッシュを追加しました、それは実際にそこにあります。

4

5 に答える 5

2

3 番目の角度を試してみます。

正規表現が正規表現コーチの何かに「一致」し、必要な部分に一致するという事実を混乱させていると思います。したがって、置換結果には驚かされます。

置換は、一致したすべての入力を新しいトークンに交換します。

否定後読みは、パターンが存在しないことを確認しますが、パターンは一致した入力の一部ではありません。

得られる結果は、UR​​L のパス (一致文字列) のみが一致した入力であり、これを newDomain 変数に置き換えているためです。

それがあなたが得ている結果を得ている理由です。

于 2009-07-16T22:07:00.013 に答える
1

いくつかの考え:

  • をエスケープする必要がありますか。正規表現で?私は<!構文を知らず、手元に本を持っていないので、これは議論の余地があるかもしれません.
  • あなたの例では www.foo.com の後に / がないため、http://www.foo.com/somethingとどのように一致するかわかりません。

その一部が役立つことを願っています。

于 2009-07-15T21:49:12.170 に答える
0

私はこれを試してみます

content = Regex.Replace(content,"(?<!" + newDomain + ")^[^/]+/(?=" + match + ")", newDomain + match);

これは、ドメインがnewDomainでなく、パスが一致している場合にのみ一致します(したがって、式のドメイン部分を置き換えます)。

于 2009-07-15T22:38:54.177 に答える
0

多分私は何かが欠けているかもしれませんが、否定的な後読みを使用する必要がありますか? 本質的に、後読みは何にも一致しません。ドメインとパスを一致させてから、ドメインを置き換えたいのですが。右?

したがって、次のようになります。

Regex.Replace("http://www.foo.com/something", "(http://www.foo.com/)(something)", "http://www.abc.com/$2")

アイデアは、グループ化を有利に使用することです。ここで、$2 の部分が一致の後半部分 (パス) を取得し、それを新しいドメインに追加します。これをRegex Hero (.NET 正規表現テスター) でテストしたところ、動作しました。ところで、Regex Coach は Perl ベースであり、.NET 正規表現エンジンと比較すると、いくつかの違いに遭遇する場合があります。

于 2009-07-15T22:52:59.857 に答える
0

文字列に置換対象のドメイン部分が見つからない場合に、それを置換するだけというアイデアはどうですか?

つまり、perl を略記として悪用するには:

if ($string !~ /foo\.com) {
  $string = $domain . $string;
}
于 2011-10-07T09:24:18.027 に答える