开发者

regex for name with capital letters in Xcode

I am trying to change all names that looks like this: thisForExample and change it with: 开发者_如何学Pythonthis_for_example in Xcode with regex. Does anyone know how to do that?

I have tried with this: ([a-z][A-Z])*[a-z]? but it does not find anything.


You just need to find [a-z][A-Z][a-z].

Automating the replacement process will be tricky though - how do you plan on changing an arbitrary upper case letter to its lower case equivalent ?


Perl would be a good tool for this (if you insist on using Regex)as it supports case modification in substitution patterns:

  • \l => change first char (of following match variable) to lower case
  • \L => change all chars (of following match variable) to lower case
  • \u => change single char (of following match variable) to upper case
  • \U => change all chars (of following match variable) to upper case

If all you care is to convert (simple/trivial!) variables and method names à la thisForExample into this_for_example.
For this a single regex like this would be sufficient:

echo 'thisForExample = orThisForExample();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "this_for_example = or_this_for_example();"

As soon however as you're expecting to come across (quite common) names like…

fooURL = URLString + URL + someURLFunction();

…you're in trouble. Deep trouble.

Let's see what our expression does with it:

echo 'fooURL = URLString + URL + someURLFunction();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "foo_url = _urlstring + _url + some_urlfunction();"

Pretty bad, huh?

And to make things even worse:
It is syntactically impossible to distinguish between a (quite common) variable name "URLString" and a class name "NSString".

Conclusion: Regex alone is pretty hack-ish and error prone for this kind of task. And simply unsufficient. And you don't want a single shell call to potentially mess up your entire code base, do you?
There is a reason why Xcode has a refactor tool that utilizes clang's grammar tree to differentiate between syntactically identical (pattern-wise at least) variable and class names. This is a problem for context free languages, not regular languages. Hence regular expressions cannot deal with it. You'd need a contect free grammar to generate a language tree, etc. (and at that time you've just started building a compiler)

Also: Why use under_scores anyway? If you're using Xcode then you're probably coding in ObjC(++) or similar anyway, where it's common sense to use camelCase. I and probably pretty much everybody else would hate you for making us one day deal with your underscored ObjC/C/… code.


Alternative Answer:

In a comment answer to Paul R you said you were basically merging two projects, one with under_scored naming, one with camelCased naming.
I'd advise you then to switch your under_scored code base to camelCase. For two reasons:

  1. Turning under_scored names into camelCased is way less error prone then vice versa. (That is: in a camelCase dominated environment only, of course! it would be just as error prone if you'd mainly deal with under_scored code in Xcode. Think of it as "there's simply less code to potentially break" ;) )

  2. Quoting my own answer:

[…] I and probably pretty much everybody else would hate you for making us one day deal with your underscored ObjC/C/… code. […]

Here is a simple regex for converting under_score to camelCase:

echo 'this_for_example = _leading_under_score + or_this_for_example();' \
| perl -pe 's/(?<=[\w])_([\w])/\u\1/g;'
//output: "thisForExample = _leadingUnderScore + orThisForExample();"


Something like ([a-zA-Z][a-z]+)+?

The process could like this: You get all the names to a file, there you automatically forge the replacement, and make (automatically) sed script to change one to another.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜