Puzzle 1: Send it by RegEx
Volume Number: 19 (2003)
Issue Number: 6
Column Tag: John and Pals' Puzzle Page
Puzzle 1: Send it by RegEx
by John A. Vink
Try to solve this programming puzzle before the score drops to zero. The puzzle is presented as a discussion among engineers in a chat room. As the engineers gather information and make suggestions, see if you can find the solution. If you solve the problem before you get to the end of the puzzle, you get the score in the left hand column.
We start off our initial monthly puzzle with something simple.
ChrisE: OK, serious question.
100 ChrisE: find . -regex ".*/Versions/[ABCDEFG]/[^/]*" finds me all the dylibs in /System/Library/Frameworks
ChrisE: But it also finds the _debug and _profile versions. What do I do to the regex to exclude files that have a _ in them?
95 JAV: Is a pipe to grep -v out of the question?
ChrisE: Yes 'cuz it's the -regex arg to find and I want to do a -exec.
90 Pie R. Square: You want [^_] in there somewhere.
ChrisE: tried [^_]*
85 BMA: Pie, the problem is that regular expression matches any substring of the path.
BMA: ChrisE, I believe you want -prune.
80 Pie R. Square: Does this give you want you want: find . -regex ".*/Versions/[ABCDEFG]/[^/_]*"
ChrisE: Yes, it does. Thx.
75 BMA: No, Pie, because [^/_]* matches the empty string.
Keith: Wouldn't you want [^_]+, since you always want at least 1 character in the filename?
70 ChrisE: Luckily I'm not passing it any empty strings.
BMA: I believe you need to put the regular expression between ^ and $ in addition.
65 BMA: Ah, i see, -regex in find is implicitly ^$.
BMA: No, Pie, consider this:
60 BMA: "foo_bar"
BMA: matches "foo[^_]*"
BMA: because there is nothing saying "match the entire string".
55 BMA: OK, then what Pie said will work, ChrisE. But in general, you can't assume that.
ChrisE: Well, the problem is to find all dylibs in /System/Library/Frameworks and exclude _debug and _profile libs, and it works for this one case, so I'm there.
ChrisE: This is just adhocery, not production.
Pie R. Square: How could it not be?
50 BMA: Pie, regular expression "a" is matched by string "bab".
BMA: Likewise regular expression "a*" is matched by string "bcb".
Pie R. Square: I just meant, I wouldn't expect find to work that way.
45 BMA: It is the only tool that i have ever seen that takes a regexp and implicitly puts it inside ^$
40 Keith: Can you pass two -regex arguments to find, and have the second one be [^(_debug)|(_profile)]. I can't tell from the manpage whether that would work or not.
35 Pie R. Square: It didn't produce any output.
30 BMA: ^ doesn't work that way, Keith.
ChrisE: It worked. Give it up. I've done what I need to do and have moved on.
Pie R. Square: ChrisE, you don't know us very well, do you?
25 BMA: Also, I do want to consider the more general problem.
BMA: It turns out that you could match your exact set with a regular expression in this case.
BMA: But what if the include and exclude sets need a regular expression?
20 BMA: Looks like find -regex RE1 -and \! -regex RE2 works.
15 Keith: Try adding a \! -name '"*_debug"' \! -name '"*_profile"' to the find, ChrisE.
ChrisE: No. It worked. I'm done. You try it.
Keith: I did. It seemed to work for me.
ChrisE: Lucky you.
10 JAV: Remember Kon & Bal's Puzzle Page? Lots of conversations here sound like that.
BMA: I looooooooooooooove Kon and Bal!
5 BMA: I am so sad there is nothing like that now.
JAV: Well, we can extract the chats from here and make one.
Pie R. Square: How about this chat?
Bubba: You should play poker with Kon.
Bubba: Hey, we could get a column in that programmers magazine!
JAV: MacTech?
ChrisE: Gotta go, see y'all later. Thanks!
Score:
85-100 Can I borrow your regular expressions handbook?
65-80 Don't go away, maybe you can help me with this
other problem...
45-60 Yeah, I remember using Unix in college too.
25-40 If you can't find it, the Terminal application is in
/Applications/Utilities
Still using Mac OS 9? Time to upgrade to that new OS.
John A. Vink (aka "JAV") is a software engineer for Apple Computer, Inc. He takes a break in the summer to follow INXS on tour. His pals are a bunch of smart friends scattered throughout the Mac programming landscape. You can contact him at vink@apple.com. (The pals reference makes sense with the "John And Pals' Puzzle Page" title)