0

我已经遇到了一个“小”问题......我只想用其他名称或其他名称替换一些名称。到目前为止它工作正常,但有些名字我遇到了问题。

例如我想替换"Cho""Cho'Gath",但我当然不想替换"Cho'Gath""Cho'Gath'Gath"

因此,我创建了这个正则表达式,并替换了所有"Cho"的除了"Cho'Gath"

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

这有效,它不能取代"Cho'Gath",但它也不能取代"Cho Hello World Gath"......这是我的第一个问题!

第二个是以下:我也想替换 all "Yi",但不是"Master Yi",所以我尝试了以下正则表达式:

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

这不能代替"Master Yi",好吧。但它也不能取代"Yi",但它应该做!(我也试过/\b(?!Master(**\s**))Yi\b/i,但这也不起作用)

到目前为止,我不知道该怎么做……有人可以帮我吗?

4

2 回答 2

0

对于第一个正则表达式:

\bCho(?!.Gath)\b

对于第二个:

(?<!\bMaster )Yi\b

您的第一个正则表达式.+包含在其中,即一个字符,一次或多次;并且由于量词默认是贪婪的,这会在不情愿地回馈匹配下一个标记(G)之前吞下整个输入。

您的第二个正则表达式使用了否定的lookahead,而您想要的是否定的lookbehind。即,该位置之前的文本不匹配的位置。

请注意,lookbehinds 中的正则表达式必须是有限长度的。

于 2013-01-30T22:19:01.633 回答
0

如果您替换.+为您想要匹配(或不匹配)的实际字符,您的第一个问题很容易解决:'但是让我们看看第二个,这很有趣:

我也想替换所有的“易”,而不是“易大师”,所以我用下面的正则表达式尝试了同样的方法:

/\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 回答