【问题标题】:Regular Expression Exclude Word正则表达式排除单词
【发布时间】:2016-05-09 17:43:41
【问题描述】:

我正在尝试替换名称为“eventHandler”或以“...EventHandler”结尾的所有事件处理函数,以封装在一个公共事件处理函数中,该函数在实际调用事件之前执行附加任务处理程序。

简而言之,我正在尝试使用查找和替换中的正则表达式(在 sublime 文本编辑器中)执行此操作:

loginEventHandler(args, callback) => processEventHandler(loginEventHandler, args, callback)

[查找]

(eventHandler|(?!processEventHandler)\w+EventHandler)((.*))

[替换]

processEventHandler($1, $2)

这没有按预期工作。该查找也匹配 rocessEventHandler 。如果函数名称为“processEventHandler”,如何忽略匹配函数?

我尝试了以下问题中提到的解决方案,但没有帮助。

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

A regular expression to exclude a word/string

这是测试结果:

【问题讨论】:

  • 您正在使用不支持 Boost 正则表达式语法的正则表达式测试器。使用带有 PCRE 的 regex101 作为 regex falvor。另外,请在问题本身中发布示例文本。
  • 这里是示例文本: loginEventHandler(err, result) processEventHandler(loginEventHandler, err, result) eventHandler(err, result) appInitEventHandler(err, result) initProcessEventHandler(err, result) initprocessEventHandler(err,结果)通用(e,r)
  • 这个怎么样:regex101.com/r/dP7zD8/1?
  • @AnkitMishra 不能使用 ^,因为函数不会位于字符串的开头。例如:return someEventHandler(e, r);

标签: javascript regex sublimetext2 sublimetext3 sublimetext


【解决方案1】:

基本上,您的正则表达式将字符串的一部分与process 匹配是因为正则表达式未在开头锚定。如果您需要匹配字符串开头的字符串,请使用^。如果您打算只在较大的文本中匹配它们,请使用\b(单词边界)。

您可以使用正则表达式,并在前导词边界处锚定负前瞻:

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

见regex demo

正则表达式(不区分大小写,因为(?i) 内联修饰符)匹配:

  • \b - 单词边界
  • (?!process) - 如果找到以下字符序列,则匹配失败:\w* - 零个或多个字母数字符号 + EventHandler
  • \( - 左括号
  • ([^)]*) - 除) 之外的零个或多个字符
  • \) - 右括号

【讨论】:

  • 我在您的正则表达式中唯一更改的是,我使用 (.*) 而不是 ([^)]*) 来匹配如下函数调用。 return loginEventHandler(new Error('Invalid credentials'), result);
  • 如果这些字符串总是在一行上,这是可以的。如果不是这种情况,请使用(?si)(\b(?!process)\w*EventHandler)\((.*?)\); 甚至(?si)(\b(?!process)\w*EventHandler)\((.*?)\);(?=\h*(?:$|\R))
【解决方案2】:

如果原来的 EventHandler 只有 2 个参数,这可以工作

[查找]

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

[替换]

processEventHandler($1, $2, $3)

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2017-03-13
    • 2019-04-30
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多