2012-01-24 53 views
6

请考虑javascript代码下面的部分:只更换正则表达式匹配

"myObject.myMethod();".replace(/\.\w+\(/g, "xxx"); 

它给“myObjectxxx);”为“.myMethod(”被选中。

现在我只会选择myMethod。换句话说,我想选择以.开头并以((不包括)开头的任何单词。

谢谢,卢卡。

回答

18

笼统的回答:捕获要保持与括号内的部分,包括它在替换字符串中为$1

有关详细信息,请参阅任何正则表达式替换教程。

这里:只需在您的替代字符串中包含.(

对于练习,写一个正则表达式,将转方案--ABC--DEF--的任何字符串--DEF--ABC--ABCDEF任意字母值。所以--XY--IJK--应该变成--IJK--XY--。在这里你确实需要使用捕获组和反向引用。

+0

非常感谢!我终于理解了使用括号和$替换... – lviggiani

3

您可以使用lookaround断言:

.replace(/(?<=\.)\w+(?=\()/g, 'xxx') 

这些将使比赛,而在同一时间不是比赛本身的一部分成功。因此,你只需要替换它们之间的部分。

为人们熟悉的正则表达式的更容易的选择可能是仅仅包括在更换.(还有:

.replace(/\.\w+\(/g, ".xxx(") 
+2

一种不使用'\ 1'的解决方法,不是吗?我的意思是,太多人不知道前瞻和后顾之忧,但往往他们与更高的成本相关联。特别是在这里,当它们在弦的开始或尾部时,无论如何都要被替换。 –

+0

也许吧。然而,有两件事情需要保留,所以你基本上需要'-replace'(\。)\ w +(\()','$ 1xxx $ 2'(对不起,回到PowerShell)。可读性比'-replace'\。\ w + \(','.xxx(''。在任何情况下,环视都不会明显更昂贵(如果有的话),并且教人们新的概念很难被认为是错误的。 – Joey

+0

是的,我错过了这些字符串甚至是固定的字符串,然后立即包含它们当然更容易,但是,他应该了解使用捕获组,例如交换两个值 –

1

我建议稍微不同的方法:

"myObject.myMethod();".replace(/^([^\.]*\.)\w+(\(.*)$/g, "$1xxx$2"); 

虽然简单的解决方案已经提出。

+0

那么,这也是我也建议的那个,捕获组是正则表达式的一个关键特性,每个人都应该知道。 –

+0

@ Anony-Mousse:同意,但我有点困惑你的答案中有'\ 1'。 IIRC,这只是在正则表达式本身中引用一个组的方式,而不是需要'$ 1'的替换字符串。如果我错了,请纠正我。 –

+0

这取决于你的正则表达式的方言。我猜JS只使用'$ 1'。 Perl既可以,sed也可以使用'\ 1' IIRC。 –