Return first match of Ruby regex

前端 未结 5 1421
甜味超标
甜味超标 2020-12-07 21:26

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

相关标签:
5条回答
  • 2020-12-07 22:05

    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.

    0 讨论(0)
  • 2020-12-07 22:06

    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"
    
    0 讨论(0)
  • 2020-12-07 22:07

    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"
    
    0 讨论(0)
  • 2020-12-07 22:13

    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).

    0 讨论(0)
  • 2020-12-07 22:28

    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
    
    0 讨论(0)
提交回复
热议问题