我正在尝试更改所有看起来像这样的名称:thisForExample
并在Xcode中使用正则表达式更改为:this_for_example
。有谁知道怎么做?
我试过这个:([a-z][A-Z])*[a-z]?
但它找不到任何东西。
答案 0 :(得分:1)
您只需找到[a-z][A-Z][a-z]
。
自动化替换过程将会很棘手 - 您如何计划将任意大写字母更改为小写字母?
答案 1 :(得分:0)
像([a-zA-Z][a-z]+)+
?
这个过程可能是这样的: 你得到一个文件的所有名称,你自动伪造替换,并制作(自动)sed脚本来改变一个到另一个。
答案 2 :(得分:0)
Perl 将是一个很好的工具(如果你坚持使用Regex),因为支持替换模式中的案例修改:
\l
=>将第一个字符(以下匹配变量)更改为小写\L
=>将所有字符(以下匹配变量)更改为小写\u
=>将单个字符(以下匹配变量)更改为大写\U
=>将所有字符(以下匹配变量)更改为大写如果您只关心将(简单/琐碎!)变量和方法名称àlathisForExample
转换为this_for_example
。
对于这个单一的正则表达式就足够了:
echo 'thisForExample = orThisForExample();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "this_for_example = or_this_for_example();"
然而,你很快会遇到(很常见的)名字,比如......
fooURL = URLString + URL + someURLFunction();
......你遇到了麻烦。 深陷困境。
让我们看看我们的表达用它做什么:
echo 'fooURL = URLString + URL + someURLFunction();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "foo_url = _urlstring + _url + some_urlfunction();"
非常糟糕,是吗?
更糟糕的是:
在语法上在变量名“URLString”和类名“NSString”之间区分是。
结论:正则表达式非常 hack-ish且容易出错。只需效率低下。并且您不希望单个shell调用潜在地搞乱整个代码库,对吗? Xcode有一个重构工具,它利用clang的语法树来区分语法相同(至少是模式)变量和类名。 这是上下文免费语言的问题,而不是常规语言。因此正则表达式无法处理。你需要一个无竞争语法来生成一个语言树等(当时你刚开始构建编译器)
另外:为什么还要使用under_scores?如果您正在使用Xcode,那么无论如何您可能使用ObjC(++)或类似代码进行编码,其中使用camelCase是常识。我可能非常每个人其他会讨厌你让我们有一天处理你强调的ObjC / C / ...代码。
替代答案:
在对Paul R的评论中,你说你基本上是合并两个项目,一个是under_scored命名,一个是camelCased命名。 我建议你将你的under_scored代码库切换到camelCase 。有两个原因:
将under_scored名称转换为camelCased不太容易出错,反之亦然。 (也就是说:当然只有在camelCase主导的环境中!如果你主要处理Xcode中的under_scored代码,它就会容易出错。把它想象成“只有更少的代码可能会破坏”;))< / p>
引用我自己的答案:
[...]我和可能很多 每个人其他会恨你让我们有一天与你打交道 强调了ObjC / C / ...代码。 [...]
这是一个简单的正则表达式,用于将under_score转换为camelCase:
echo 'this_for_example = _leading_under_score + or_this_for_example();' \
| perl -pe 's/(?<=[\w])_([\w])/\u\1/g;'
//output: "thisForExample = _leadingUnderScore + orThisForExample();"