0

私はすでに「小さな」問題を抱えています...私はいくつかの名前を他の名前か何かに置き換えたいだけです。これまでは問題なく動作しましたが、名前によっては問題が発生しました。

たとえば、に置き換えたいのです"Cho""Cho'Gath"、もちろん、に置き換えたくありませ"Cho'Gath""Cho'Gath'Gath"

したがって、この正規表現を作成し、 :"Cho"を除くすべての'を置き換えます。"Cho'Gath"

/\bCho(?!.+Gath)\b/i

これは機能し、置き換えられません"Cho'Gath"が、置き換えられません"Cho Hello World Gath"...それが私の最初の問題です!

2つ目は次のとおりです。すべてを置き換えたいのです"Yi"が、ではない"Master Yi"ので、次の正規表現で同じことを試しました。

/\b(?!Master.+)Yi\b/i

これは置き換えられません"Master Yi"、大丈夫です。しかし、それも置き換えられませんが、置き換え"Yi"られるはずです!(私も試し/\b(?!Master(**\s**))Yi\b/iましたが、これも機能しません)

これまでのところ、私は何を知っているのかわかりません...誰かがそれを手伝ってくれるでしょうか?

4

2 に答える 2

0

最初の正規表現の場合:

\bCho(?!.Gath)\b

2番目の場合:

(?<!\bMaster )Yi\b

あなたの最初の正規表現には.+、1文字、1回以上含まれていました。量指定子はデフォルトで貪欲であるため、次のトークン ( G) に一致するようにしぶしぶ戻す前に、入力全体を飲み込みます。

あなたの 2 番目の正規表現は否定的な先読みを使用しました。あなたが望んでいたのは否定的な後読みでした。つまり、その位置より前のテキストが一致しない位置です。

また、後読みの正規表現は有限の長さでなければならないことに注意してください。

于 2013-01-30T22:19:01.633 に答える
0

最初の問題は、一致さ.+せたい (または一致させたくない) 実際の文字に置き換えれば簡単に解決できます:'が、2 番目の問題を見てみましょう。これは非常に興味深いものです。

また、「Master Yi」ではなくすべての「Yi」を置き換えたいので、次の正規表現で同じことを試しました。

/\b(?!Master.+)Yi\b/i

これは に対する否定的な先読み\bです。この表現単一の「Yi」に一致しますが、「Master Yi」の場合は次のようになります。

Hello I am Master Yi
                 ^
                 \b

この境界には「マスター」は続きませんが、「イー」が続きます。したがって、表現はこの文字列の「Yi」にも一致します。

否定先読みは、"Yi" が直接続く境界 (先読みアサーションは、ポインターを前方に移動せずに単に "先を見ている" だけであることを思い出してください) の直後に "Master" が続いていないかどうかをチェックするため、まったく無意味です。これは常に当てはまります。

.+代わりに後読みアサーションを使用できますが、後読みアサーションは固定長でなければならないため、 (とにかく不要) なしでのみ使用できます。

/\b(?<!Master )Yi\b/i

"Master " が前に付いていないすべての "Yi" に一致します。

于 2013-01-30T22:37:26.977 に答える