函数名与左括号间不得有空格,sublime可用正则\b(?!if|else|for|while|...)\w+\s+\(匹配并替换为$1(,但需人工复查双下划线方法、私有变量及嵌套调用等边界情况。

函数名和左括号之间必须紧挨着,不能有空格
这是多数编程语言(如 Python、JavaScript、C)的语法要求或 PEP/Style Guide 明确禁止的写法。Sublime 里用正则批量修正,关键不是“删所有空格”,而是只删「函数调用处」函数名与 ( 之间的空格,避免误伤字符串、注释或数组索引里的括号。
- 查找:
(\w+)\s+\(—— 匹配“单词 + 一个及以上空白 + (”,\w+能覆盖func、myVar,但不匹配if、for等关键字(若需排除,得加负向先行断言,见下条) - 替换:
$1(—— 注意是$1(,不是\1(或${1}(;写错就原样输出 - 务必先点
Find All验证:看是否命中了console.log (、getData (这类目标,同时跳过"data (id)"、arr[0] (、if (x)
如何避开 if/for/while 等关键字后的空格?
直接用 \w+ 会把 if、while 也当函数名处理,导致 if (x) → if(x),虽不报错但违反风格且易混淆。稳妥做法是加负向先行断言,明确排除常见控制流关键字。
- 查找:
\b(?!if|else|for|while|return|function|const|let|var|class|import|export)\w+\s+\( -
\b保证是完整单词边界,(?!...)是负向先行断言,不消耗字符但阻止匹配 - 注意:Sublime 的正则引擎支持
(?!...),但不支持(?(负向后行断言),所以只能从左边排除,不能靠右边判断 - 如果项目用 TypeScript,可追加
|interface|type|enum到排除列表中
为什么 ^\s*$ 删空行后,函数定义还多出空格?
这不是空行问题,而是函数定义语句本身带缩进或空格,比如:
def my_func (x):
这种写法在 Python 中语法合法但被 PEP 8 明确反对。删空行操作对它完全无效——因为整行非空,只是括号前有空格。必须回到上一条规则,用 \b\w+\s+\( 单独处理。
- 别依赖「删空格」功能(如
Trim Whitespace),它只处理行首/行尾,不管中间 - 大文件慎用
\s+:它可能跨行匹配(尤其勾选了. matches newline),导致意外吞掉换行符;保持该选项关闭 - Python 用户额外注意:lambda 表达式如
lambda x : x+1不含括号,无需处理;但func_name (x)必须修
替换后发现 __init__ (self) 变成 __init__(self),这算错吗?
不算错,但需人工确认。双下划线方法名(如 __init__、__str__)仍是合法函数名,\w+ 会正常捕获。如果你的代码规范允许双下划线前保留空格(极少见),就得改用更窄的模式,例如:
- 查找:
\b[a-zA-Z_][a-zA-Z0-9_]*\s+\(—— 排除开头数字,但仍包含双下划线 - 真正难处理的是私有变量命名如
_helper (x):下划线开头也是合法函数名,无法靠正则自动区分语义 - 结论:正则能解决 90% 的显性空格问题,但边界情况(
__xxx__、_xxx、宏定义、模板字符串插值)必须人工复查
foo (bar (x))。上面的正则只会修外层 foo (,内层 bar ( 会被第二次 Find All 命中——这意味着你得跑两遍,或接受分步处理。











