首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有异常的preg_replace对我不起作用

带有异常的preg_replace对我不起作用
EN

Stack Overflow用户
提问于 2013-01-31 06:14:10
回答 2查看 237关注 0票数 0

我已经有一个“小”问题了.我只想用其他名字或其他东西替换一些名字。到目前为止,它工作得很好,但对于某些名称,我遇到了一个问题。

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

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

代码语言:javascript
复制
/\bCho(?!.+Gath)\b/i

这是可行的,它不会取代"Cho'Gath",但也不会取代"Cho Hello World Gath"……这是我的第一个问题!

第二个问题是:我也想替换所有的"Yi",但不是"Master Yi",所以我用下面的正则表达式尝试了同样的方法:

代码语言:javascript
复制
/\b(?!Master.+)Yi\b/i

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

到目前为止我不知道该怎么做知道..。有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-31 06:37:27

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

我也想替换所有的"Yi",而不是“Yi Master”,所以我用下面的正则表达式尝试了相同的方法:

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

这是\b上的负值前视。表达式确实匹配一个"Yi",但是看看它对“Yi”做了什么:

代码语言:javascript
复制
Hello I am Master Yi
                 ^
                 \b

这个界限不是“师父”,而是“易”。因此,您的表达式也与此字符串中的"Yi“匹配。

负向先行是没有意义的,因为它会检查"Yi“直接跟随的边界(记住,先行断言只是”向前看“,而不是将指针向前移动),而不是"Master”。情况总是这样的。

您可以改为使用lookbehind断言,但只能不使用.+ (无论如何都不必要),因为lookbehind断言必须具有固定的长度:

代码语言:javascript
复制
/\b(?<!Master )Yi\b/i

匹配每个不以"Master“开头的"Yi”。

票数 0
EN

Stack Overflow用户

发布于 2013-01-31 06:19:02

对于第一个正则表达式:

代码语言:javascript
复制
\bCho(?!.Gath)\b

对于第二个:

代码语言:javascript
复制
(?<!\bMaster )Yi\b

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

您的第二个正则表达式使用了负前视,您想要的是负后视。也就是说,该位置之前的文本不匹配的位置。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14614851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档