I\'m looking for a way to perform a regex match on a string in Ruby and have it short-circuit on the first match.
The string I\'m processing is long and from what it
A Regular Expression (regex) is nothing but a finite state machine (FSM).
An FSM attempts to answer the question "Is this state possible or not?"
It keeps attempting to make a pattern match until a match is found (success), or until all paths are explored and no match was found (failure).
On success, the question "Is this state possible or not?" has been answered with a "yes". Hence no further matching is necessary and the regex returns.
See this and this for more on this.
Further: here is an interesting example to demonstrate how regex works. Here, a regex is used to detect if a give number is prime. This example is in perl, but it can as well be written in ruby.
You can use []: (which is like match)
"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches capture group 1, i.e. what is inside ()
# => "account2"
"foo+account2@gmail.com"[/\+([^@]+)/] # matches capture group 0, i.e. the whole match
# => "+account2"
You could try variableName[/regular expression/]. This is an example output from irb:
irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"
I am not yet sure whether this feature is awesome or just totally crazy, but your regex can define local variables.
/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"
(Taken from http://ruby-doc.org/core-2.1.1/Regexp.html).
If only an existence of a match is important, you can go with
/regexp/ =~ "string"
Either way, match should only return the first hit, while scan searches throughout entire string. Therefore if
matchData = "string string".match(/string/)
matchData[0] # => "string"
matchData[1] # => nil - it's the first capture group not a second match