将 Pascal 大小写的 setter 转换为下划线分隔的变量名
-
12-09-2019 - |
题
这并不像看起来那么简单。你们中的大多数人可能会想到正则表达式 /([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
}
>>>
不隶属于 StackOverflow