我正在使用代码生成工具,并且需要转换这样的方法调用(它是java):
public MyObjectType MyObjectType(){
Run Code Online (Sandbox Code Playgroud)
转换成更java的版本:
public MyObjectType myObjectType(){
Run Code Online (Sandbox Code Playgroud)
我有这个Scala代码的工作片段来做到这一点:
val pattern = """[\s]+public[\s]+[\w]+[\s]+([\w]+\(\))\{""".r
val tmp = pattern.findAllIn(s).matchData map { m =>
val x = m.group(1).replaceAll("\\(\\)", "\\\\(\\\\)")
s.replaceAll(x, firstLowerCase(x))
}
// if there is no match, return unmodified string,
// otherwise return the only match
val converted = if (tmp.isEmpty) s else tmp.next()
Run Code Online (Sandbox Code Playgroud)
哪一s行代码是转换的可能候选者。
该函数firstLowerCase定义为:
def firstLowerCase(s: String): String = {
val (first, rest) = s.splitAt(1)
first.toLowerCase + rest
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但是我想知道是否有可能将其精简一些(理想情况下简化为单个模式match语句),例如,通过(以某种方式)删除()to 的显式转换\(\),进行匹配并替换为一个拍摄或将上述功能纳入替代品。我不是正则表达式专家,所以也许这个问题太多了。有想法吗?
尝试这个:
val pattern = """(public\s+\w+\s+)(\w)(?=\w*\(\)\{)""".r
val converted = pattern.replaceAllIn(s, m => m.group(1) + m.group(2).toLowerCase)
Run Code Online (Sandbox Code Playgroud)
replaceAllIn使得不必做findAllIn,然后再回去做replaceAll。我们将模式的开头部分与我们需要匹配的小写字符进行匹配,然后使用前瞻性断言来处理其余部分(我们不需要替换它,只需确认它存在即可)。替换文本是模式的开始,firstLowerCase不需要将单个字符转换为小写。
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |