【问题标题】:Convert Pascal-cased setter to an underscore-separated variable name将 Pascal 大小写的 setter 转换为下划线分隔的变量名
【发布时间】:2009-07-13 12:23:25
【问题描述】:

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

考虑一个常规的 setter:

public function setUserId()

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

public function setUserId($user_id)

这是一件很容易考虑的事情,但不像我深入思考那么简单。它类似于 this thread 中的 Andreas_D,但增加了尝试迭代修改变量名的挑战...

使用正则表达式可能会很明显,但我对它们还是很陌生。无论哪种方式,我在搜索的任何地方都找不到合适的解决方案。

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

【问题讨论】:

    标签: regex setter substitution camelcasing pascalcasing


    【解决方案1】:

    首先搜索函数定义,然后在每个匹配项上,根据函数名称插入一个参数。

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

    此模式将匹配function-keyword 和第 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 C语言。

    例子:

    >>> s = """\
    ... public function setUserName() {
    ...   blaha
    ... }
    ... """
    >>> print s
    public function setUserName() {
      blaha
    }
    
    >>> print fix_setters(s)
    public function setUserName($user_name) {
      blaha
    }
    
    >>>
    

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

    【讨论】:

    • 真棒 MizardX。这正是我所需要的,而且效果很好。我还不了解 Python(仍然打算学习...),但它是一种非常直观的语言,易于阅读。非常适合测试用例。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多