正则表达式为Xcode中的大写字母

时间:2011-02-04 14:22:25

标签: regex xcode

我正在尝试更改所有看起来像这样的名称:thisForExample并在Xcode中使用正则表达式更改为:this_for_example。有谁知道怎么做?

我试过这个:([a-z][A-Z])*[a-z]? 但它找不到任何东西。

3 个答案:

答案 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 。有两个原因:

  1. 将under_scored名称转换为camelCased不太容易出错,反之亦然。 (也就是说:当然只有在camelCase主导的环境中!如果你主要处理Xcode中的under_scored代码,它就会容易出错。把它想象成“只有更少的代码可能会破坏”;))< / p>

  2. 引用我自己的答案:

  3.   

    [...]我和可能很多   每个人其他会恨你让我们有一天与你打交道   强调了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();"