2012-01-24 129 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。 –