我已经遇到了“小问题”...... 我只想用其他名字或其他东西替换一些名字。 它到目前为止工作正常,但有一些名字我遇到了问题。
例如,我想将"Cho"
替换为"Cho'Gath"
,
但我当然不想将"Cho'Gath"
替换为"Cho'Gath'Gath"
。
因此我创建了这个正则表达式,并替换"Cho"
以外的所有"Cho'Gath"
:
/\bCho(?!.+Gath)\b/i
这样做并且它不会取代"Cho'Gath"
,但它也不会取代"Cho Hello World Gath"
......这是我的第一个问题!
第二个是以下内容:我还要替换所有"Yi"
,而不是"Master Yi"
,所以我尝试使用以下正则表达式:
/\b(?!Master.+)Yi\b/i
这不会取代"Master Yi"
,好的。但它也不会取代"Yi"
,但它应该做到! (我也试过/\b(?!Master(**\s**))Yi\b/i
,但这也行不通)
到目前为止,我不知道该怎么做...有人可以帮我吗?
答案 0 :(得分:0)
对于第一个正则表达式:
\bCho(?!.Gath)\b
第二个:
(?<!\bMaster )Yi\b
你的第一个正则表达式中有.+
,即一个字符,一次或多次;并且由于量词在默认情况下是贪婪的,这会吞下整个输入,然后不情愿地回馈以匹配下一个标记(G
)。
你的第二个正则表达式使用了负向前瞻,你想要的是一个负面的 lookbehind 。也就是说,之前的位置与该位置不匹配的位置。
请注意,lookbehinds中的正则表达式必须是有限的长度。
答案 1 :(得分:0)
如果您将.+
替换为您想要匹配(或不匹配)的实际字符,则可以轻松解决您的第一个问题:'
,但让我们看看第二个问题,非常有趣:
我也想替换所有“易”,但不是“易师傅”,所以我试过了 与以下正则表达式相同:
/\b(?!Master.+)Yi\b/i
这是\b
的负面预测。表达确实匹配单个“Yi”,但看看它对“Yi Yi”的作用:
Hello I am Master Yi
^
\b
此边界后面没有“Master”,但后面跟着“Yi”。所以你的表达式也匹配这个字符串中的“Yi”。
否定前瞻是毫无意义的,因为它检查直接跟随“Yi”的边界(记住前瞻断言只是“向前看”而不向前移动指针)并不直接跟随“Master”。情况总是这样。
您可以使用lookbehind断言,但只能使用(无论如何不必要).+
,因为lookbehind断言必须具有固定的长度:
/\b(?<!Master )Yi\b/i
匹配前面没有“Master”的每个“Yi”。