2

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

考虑一个常规的二传手:

public function setUserId()

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

public function setUserId($user_id)

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

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

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

4

1 回答 1

2

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

/\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 版之前)使用模数运算符 (" %") 进行格式化,类似于sprintfC 语言。

例子:

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

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

>>>

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

于 2009-07-13T12:54:00.163 回答