将Pascal-cased setter转换为下划线分隔的变量名

时间:2009-07-13 12:23:26

标签: regex setter substitution camelcasing pascalcasing

这并不像看起来那么简单。你们大多数人都可能正在考虑我在互联网上发现的正则表达式/([A-Z])/_$1/,但我的特殊情况稍微复杂一些。我的源字符串包含更多我 想要在我之前 之前转换的内容。

考虑一个常规的设定者:

public function setUserId()

当然,这种方法缺少一个参数。也许我有很多这样的方法。我想将该行转换为

public function setUserId($user_id)

这是一个相当简单的事情要考虑,但并不像我更深入地思考它那么简单。它类似于this thread中的Andreas_D,但是尝试迭代修改变量名称的额外挑战......

使用正则表达式可能会显而易见,但我对它们仍然很新。无论哪种方式,我在搜索的任何地方找不到合适的解决方案。

编辑:当然,我意识到“公共职能”中没有资本可以保证安全。但是,这个搜索&替换将针对代码块运行,我想确保我修改的字符串以“公共函数”开始

1 个答案:

答案 0 :(得分:2)

首先搜索函数定义,然后在每次匹配时,根据函数名称插入参数。

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g

此模式将为您提供与function - 关键字和组1中的函数名称以及组2中函数名称的驼峰部分的匹配。

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g

此模式将找到构成驼峰大小写的大写/小写序列之前的最后一个字母。

您没有指定要使用的语言,因此这是使用Python的演示:

import re

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)')
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))')

def fix_setters(code):
    def replacer(match):
        var_name = pattern2.sub(r'\1_', match.group(2)).lower()
        return "%s($%s)" % (match.group(1), var_name)
    return pattern1.sub(replacer, code)

最后一行(“return pattern1.sub(replacer, code)”)使用回调来生成要替换的文本。大多数语言都应该有类似的功能。

Python(版本3.0之前)使用模数运算符(“%”)进行格式化,类似于sprintf中的>>> s = """\ ... public function setUserName() { ... blaha ... } ... """ >>> print s public function setUserName() { blaha } >>> print fix_setters(s) public function setUserName($user_name) { blaha } >>> 。语言C。

示例:

{{1}}

更多信息:.NET - How can you split a “caps” delimited string into an array?