in reply to Re^2: Regex - Matching prefixes of a word
in thread Regex - Matching prefixes of a word

WOW! sounds like a very cool game! I agree with CountZero that this thing doesn't appear to lend itself well to a single regex per command entry.

I suspect that you will wind up saying doing a first pass that just identifies the type of tokens on command line: alpha numeric alphanumeric. So for example from what I can tell an alphanumeric thing is always wrong "Speed10", "10speed", or maybe not? - I'm guessing "speed 10" and "10 speed" would be ok, but a "run-together" thing combining 'speed' and '10' isn't valid. If you put regex code that says that "10speed" isn't valid into each command "regex", this could get to be a very big mess!

I think that you are into quite a bit more than regex'es and will need a parser of the command line. But depending upon the grammar, it may not be that complex and is perhaps even easier than the regex type approach.

  • Comment on Re^3: Regex - Matching prefixes of a word

Replies are listed 'Best First'.
Re^4: Regex - Matching prefixes of a word
by SuicideJunkie (Vicar) on Jul 28, 2009 at 13:23 UTC

    I'm not sure I follow where you're coming from when you say '...put regex code that says that "10speed" isn't valid into each command "regex"...'

    The idea is that if the regex matches the string, then I immediately know that the command is a $verb, with parameters $1, $2, $3, $4 etc, and can pass that right along with one function call. Only if I can't recognize anything, does the doctor prompt you to use the help command. I'm not trying to filter anything out, just to figure out what they meant as best I can without too much effort. The regex are generous with matching, although the parameters extracted are subject to more scrutiny, and nothing dangerous is actually done with the data in the end.

    I've got just 39 lines, covering 16 types of command and the various ways to say them.

    Example snippet from the fire command. I plan to compact the 'all X' vs 'X (all)?' vs 'X Indexes' into a single alternation that I can reuse as a '$componentSelection' but after I've gotten these gunners to shoot in the right direction.

    # FIRE!!! $cmd =~ /^$regexSubstringOf{fire}\s+$regexName(?:\s+(all))?\s* +$/i ? setCommand($player, 'fire',[] , $1, 'all') : $cmd =~ /^$regexSubstringOf{fire}\s+(all)?\s+$regexName\s*$/i +? setCommand($player, 'fire',[] , $2, 'all') : $cmd =~ /^$regexSubstringOf{fire}\s+$regexName$regexIndexes\s* +$/i ? setCommand($player, 'fire',[] , $1, $2) :
    PS: I'll add 'replace "\s+" with "\s*" where not required' to the list, so you can punch in things like "angle45dispersion15" and "speed10". Since the pieces of that parameter subsection are known to be alpha-only and number-only, there is no ambiguity. Spaces required, only where required.