2010-11-09 39 views
2

像“HorsieDoggieBirdie”这样的字符串,是否有一个非捕获正则表达式替换,会杀死“Horsie”和“Birdie”,但保持“Doggie”完整?我只能想到一个捕获解决方案:擦一个字符串,但保留其中间部分

s/(Horsie)(Doggie)(Birdie)/$2/g 

有没有像非捕获解决方案:

s/Horsie##Doggie##Birdie//g 

其中##是正则表达式代码的某种组合?具体的问题是JavaScript(innerHTML.replace),但我也会采用Perl的建议。

+3

为什么你想避免捕捉? – 2010-11-09 12:21:01

+2

那么,现在你问的问题显而易见的答案是's/HorsieDoggieBirdie/Doggie/g',但我认为这不是你真正想问的问题? – JanC 2010-11-09 12:24:34

+0

Horsies和Birdies是一个简单的例子。真正的字符串非常长,需要3个复杂的正则表达式来识别第一个,中间和结束部分。该字符串很大,所以我试图避免与内存命中和额外处理相关联的捕获(可能不正确)。 – MrSparkly 2010-11-09 13:02:48

回答

5

你没有捕捉到​​或Birdie

s/Horsie(Doggie)Birdie/$1/g; 

类似的东西也应该适用于Javascript。这可能与其获得的效率一样高效,至少与使用环视断言一样快;尽管如果你想知道肯定你应该对它进行基准测试。 (结果,当然,将取决于有问题的horsies,小狗和小鸟。)

强制性免责声明:你应该知道what happens当您使用HTML正则表达式...

+0

不错。真正的字符串是相当大的,这就是为什么我试图避免任何捕获和相关的记忆命中。我想我可以住一个:) – MrSparkly 2010-11-09 13:15:56

4

您可以使用Look-Around Assertions

s/(?:Horsie(?=Doggie))|(?:(?<=Doggie)Birdie)//g; 
+0

++:我打算推荐同样的东西 – Zaid 2010-11-09 12:34:01

相关问题