0

正規表現を使用した単語全体の一致に関して、stackoverflow で多くの例を見ました。www.abc.com を www.xyz.com に置き換えたい次のような状況があります。

string RetVal = "I am going to visit www.abc.com";
string TextToFind = @"\bwww.abc.com\b";
string TextToReplace = "www.xyz.com";
bool IgnoreCase = true;
RegexOptions regOpt = RegexOptions.None;
if (IgnoreCase)
    regOpt = RegexOptions.IgnoreCase;
RetVal = Regex.Replace(RetVal, TextToFind,TextToReplace, regOpt);

上記は正常に動作していますが、変更すると

RetVal = "I am going to visit www.abc.com/xyz.html";

それはまだ www.abc.com を www.xyz.com に置き換えていますが、私はそれを置き換えたくありません。

4

3 に答える 3

1

置換された文字列の周りに空白または行頭/行末のみを配置したいようです。

のようなものを使用します(^|\s)string to replace(\s|$)。使用している言語がわからない場合は、この文字列を少し調整する必要がある場合があります。

于 2013-09-05T16:39:11.863 に答える
1

\bは単語境界に一致するため、単語文字 ( [a-zA-Z0-9_]) から単語以外の文字への遷移はすべて一致します。

/単語全体に続く場合は一致させたくないように聞こえるため、別の境界チェックが必要になります。次のようなものが機能するはずです。

string TextToFind = @"(?<!\S)www.abc.com(?!\S)";

これにより、単語の前の文字が空白でない場合、または単語の後の文字が空白でない場合、一致が失敗します。ここでは(?<=\s)andの代わりに否定的な後読み/先読みを使用したことに注意してください(?=\s)。これにより、単語が文字列の先頭または末尾にある場合でも一致します。

于 2013-09-05T16:36:05.893 に答える
0

\bは単語境界であり、一方の側に「単語」文字 (ここでの単語文字は に一致する文字を意味します\w) があり、もう一方の側に非単語文字 ( に一致する文字) がある場合に一致し\Wます。

単語全体の定義が「文字列の先頭または末尾でない限り、前後にスペースがあるもの」である場合は、次の正規表現を使用できます。

(?<!\S)www.abc.com(?!\S)

これを正確に確認するには。

しかし、あなたはそれらの文字列で扱いwww.abc.comますか?

I'm going to visit www.abc.com; there's lots of things there.
What's this 'www.abc.com' you're speaking about?

それでも「単語全体」と見なす場合は、メイン ドメインのみをチェックする方がよいでしょう (つまり、 の後にスラッシュはありませんwww.abc.com)。

\bwww.abc.com\b(?!/)

次に、「単語全体」の定義は、リンクをメインのドメイン名のみと一致させていると思います。

于 2013-09-05T16:50:10.247 に答える