2016-02-01 111 views
3

我試圖替換所有名稱爲「eventHandler」或以「... EventHandler」結尾的事件處理函數,以封裝在通用事件處理函數中,該函數在執行其他任務之前實際上調用事件處理程序。正則表達式排除字

總之,我使用中發現&正則表達式替換試圖做到這一點(在崇高的文本編輯器):

loginEventHandler(參數,回調)=>processEventHandlerloginEventHandler ,指定參數時,回調)

[查找]

(事件處理程序?|!(processEventHand LER)\ W +事件處理程序)((。*))

如預期這不是工作[替換]

processEventHandler($ 1,$ 2)。該查找也匹配rocessEventHandler。如果函數名稱是「processEventHandler」,如何忽略匹配函數?

我試過以下問題中提到的解決方案,但沒有幫助。

Regular expression to match line that doesn't contain a word?

A regular expression to exclude a word/string

下面是測試結果:

Regular Expression Test Result

+0

您使用正則表達式測試儀不支持加速的正則表達式語法。將regex101與PCRE一起用作正則表達式。另外,請在問題本身中發佈示例文本。 –

+0

下面是示例文本: loginEventHandler(ERR,結果) processEventHandler(loginEventHandler,ERR,結果) 事件處理程序(ERR,結果) appInitEventHandler(ERR,結果) initProcessEventHandler(ERR ,結果) initprocessEventHandler(ERR,結果) 通用(E,R) – sunilkumarba

+1

嘗試['(我)(\ b(?!進程)\ W *事件處理程序)\(( [^)] *)\)'](https://regex101.com/r/dD9wI1/1) –

回答

2

基本上,你的正則表達式匹配與process字符串的一部分,是因爲正則表達式是不是在開始固定。如果您需要在字符串的開始處匹配字符串,請使用^。如果您打算在較大的文本內匹配它們,請使用\b(字邊界)。

您可以使用正則表達式與領先的字邊界固定負前瞻:

(?i)(\b(?!process)\w*EventHandler)\(([^)]*)\) 

regex demo

正則表達式(不區分大小寫,因爲(?i)在線修改)匹配:

  • \b - 一個字邊界
  • (?!process) - 如果滿足下列字符序列被發現失敗匹配負先行:\w* - 零個或多個字母數字符號+ EventHandler
  • \( - 開括號
  • ([^)]*) - 零個或多個字符比)
  • \)其他 - 右括號
+1

感謝您的幫助。這是完美的 – sunilkumarba

+0

我在你的正則表達式中唯一改變的是,我使用(。*)而不是([^)] *)來匹配類似下面的函數調用。 '返回loginEventHandler(新的錯誤(「無效憑證」),結果);' – sunilkumarba

+0

如果這些字符串總是在一行,這是確定。如果不是這種情況,可以使用'(?si)(\ b(?!process)\ w * EventHandler)\((。*?)\);'或甚至'(?si)(\ b(?! 。工序)\ W *事件處理程序)\((*)\);(= \ H *(:???$ | \ R))' –

0

如果原來的事件處理程序只有2個參數,這可能是工作

[查找]

(eventHandler|\w+EventHandler)\((.*?),(.*)\)

[替換]

processEventHandler($1, $2, $3)