What do =~ and /\\ mean in Ruby?

2020-07-05 05:53发布

问题:

I've been teaching myself Ruby and for a certain problem I'm trying to solve I notice a lot of people are using =~ and /\ in their code. I'm not really sure how they work and would just like an explanation. For example I was looking at someones code for this Pig Latin translator and this is the first time I'm seeing these being used.

def piglatin(word)
   if word =~ (/\A[aeiou]/i)
      word = word + 'ay'
   elsif word =~ (/\A[^aeiou]/i)
      match = /\A[^aeiou]/i.match(word)
      word = match.post_match + match.to_s + 'ay'
   end
word
end

I'm just confused about the /\ slashes and the =~

回答1:

=~ is known as the "match operator" and can be used to match a string against a regular expression.

The /\ is actually part of two separate things. / denotes the start of a regular expression and \A is known as an "anchor" and is saying "match from the beginning of the string."

edit: This is a link to the documentation that should help you understand more code like you posted.

thank you to Wayne Conrad for a correction on '/\'



回答2:

=~ is Ruby's pattern-matching operator.

It matches a regular expression on the left to a string on the right.

If a match is found, the index of first match in string is returned. If the string cannot be found, nil will be returned.

/abc/ =~ "abcdef"

In this case, the expression returns 0, because that is the index of the first match of "abc" in the string.

/xyz/ =~ "abcdef"

returns nil because "xyz" cannot be found anywhere in the string.

As for /\:

/     Defines the start and end of a regular expression
\     References a regular expression

For example:

\d => Matches all digits


回答3:

The equal-tilde operator in Ruby is the “match” operator. It take an regular expression on the left hand side and the string to match on the right hand side. The expression:

/or/ =~ “Hello World”

will return 7 because a match is found on index 7 of the string. The index starts at 0.

The expression:

/abc/ =~ “Hello World”

will return nil because there is no match.



回答4:

The use of /\A and =~ aside, that code is not written well, so don't emulate it. This is a bit more Ruby-like:

def piglatin(word)
  if word[/\A[aeiou]/i]
    word + 'ay'
  else
    word[1..-1] + word[0] + 'ay'
  end
end

piglatin('apple')   # => "appleay"
piglatin('banana')  # => "ananabay"

For this purpose, ^ would have worked as well as \A as they're both "beginning of..." anchors. These are from the Anchors definitions:

  • ^ - Matches beginning of line
  • \A - Matches beginning of string.


标签: ruby