Re: Regexp help
On 8/8/2012 12:13 PM, Gene Wirchenko wrote:
A bit of devil's advocate: I like regexes, but simple regexes. I
have some JavaScript code where I could have used one giant regex to
process, but I instead chose to use simple regexes and a bit of
processing. It is a lot more readable than a custom parser. The
giant regex would have been a ball of mud though.
This is fair. (If I had a parser generator handy, I'd use that.) I
agree simple regex aren't terrible. But there's a tendency to make the
simple regex "just a little more complicated to get over this one
problem." It's easy to snowball.
A simple test: two hours to hand code a parser, sans parser generator.
Vs. 24 hours or more for the OP to figure out his regex.
I wasn't actually sure of the OP's requirements, so I just captured the
three branch labels into three separate strings. Do with them as you will.
run:
To: \main\2, From: \main\rel1\2, Base: \main\2)]
To: /main/4, From: /main/bugfix/1, Base: /main/2]
To: , From: , Base:
BUILD SUCCESSFUL (total time: 0 seconds)
<code>
package quicktest;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
/**
* A parser for SCC (source code control) output.
*
* @author Brenden
*/
public class SccParser {
static String[] testVectors = {
" Needs Merge \".\" [(automatic) to \\main\\2 from \\main\\rel1\\2
(base also \\main\\2)]",
" Needs Merge \"./update\" [to /main/4 from /main/bugfix/1 base
/main/2]",
" Every programmer Needs to believe in something; I believe I Needs
another drink.",
};
/**
*
* @param args
*/
public static void main(String[] args) throws Exception {
parse(new StringReader(testVectors[0]));
parse(new StringReader(testVectors[1]));
parse(new StringReader(testVectors[2]));
}
public static void parse(Reader reader) throws IOException {
findMerge(reader);
}
// package-private
static void findMerge(Reader reader) throws IOException {
findString(reader, "Needs Merge");
skipWhiteSpace(reader);
findString(reader, "\""); // skip quoted string
findString(reader, "\"");
findEitherOrChar(reader, '/', '\\');
reader.reset(); // back one character
String to = whiteSpaceToken( reader );
findEitherOrChar(reader, '/', '\\');
reader.reset();
String from = whiteSpaceToken( reader );
findEitherOrChar(reader, '/', '\\');
reader.reset();
String base = whiteSpaceToken( reader );
System.out.println("To: "+to+", From: "+from+", Base: "+base );
}
// package-private
static void findString(Reader reader, String str) throws IOException {
if( str.length() == 0 ) return;
outerLoop:
for (int c; (c = reader.read()) != -1;) {
if (c != str.charAt(0))
continue;
reader.mark(str.length());
for (int i = 1, len = str.length(); i < len; i++) {
if ((c = reader.read()) != str.charAt(i)) {
reader.reset();
continue outerLoop;
}
}
return;
}
}
// etc. Remainder left as a exercise for readers trying to get us to
// do their homework/internship project.
}