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

考虑一个常规的 setter:

public function setUserId()

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

public function setUserId($user_id)

这是一件相当简单的事情,但我仔细思考却并不那么简单。这类似于 Andreas_D 中的内容 这个线程, ,但是尝试迭代修改变量名称增加了挑战......

使用正则表达式可能会是显而易见的事情,但我对它们仍然很陌生。不管怎样,我在搜索中找不到解决这个问题的合适方法。

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

有帮助吗?

解决方案

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

/\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 例如语言 C .

例子:

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

>>> print fix_setters(s)
public function setUserName($user_name) {
  blaha
}

>>>

更多信息: .NET - 如何将“大写”分隔字符串拆分为数组?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top