这并不像看起来那么简单。你们大多数人都可能正在考虑我在互联网上发现的正则表达式/([A-Z])/_$1/
,但我的特殊情况稍微复杂一些。我的源字符串包含更多我 想要在我做之前 之前转换的内容。
考虑一个常规的设定者:
public function setUserId()
当然,这种方法缺少一个参数。也许我有很多这样的方法。我想将该行转换为
public function setUserId($user_id)
这是一个相当简单的事情要考虑,但并不像我更深入地思考它那么简单。它类似于this thread中的Andreas_D,但是尝试迭代修改变量名称的额外挑战......
使用正则表达式可能会显而易见,但我对它们仍然很新。无论哪种方式,我在搜索的任何地方找不到合适的解决方案。
编辑:当然,我意识到“公共职能”中没有资本可以保证安全。但是,这个搜索&替换将针对代码块运行,我想确保我修改的字符串以“公共函数”开始。
答案 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?