Search code examples
ruby-on-railsrubyregexword-boundary

Why is "\b" not catching my word boundary in Rails?


I’m using Rails 4.2.7. I want to match an expression and take advantage of the word boundary expression because there may be a space, arbitrary number of spaces, or a dash between my words. But this isn’t working

2.3.0 :006 > /first\bsecond/.match('first second')
 => nil

The manual here — https://ruby-doc.org/core-2.1.1/Regexp.html suggests that “\b” is the right expression to use to catch word boundaries so I’m wondering where I’m going wrong.


Solution

  • \b matches a zero-length word boundary, not a space. You're looking for something more like this:

    /first\b.\bsecond/.match('first second')
    

    This will match any character (.) in between first and second, as long as there is a word boundary on either side.


    However, this is not how word boundaries are usually used (since there is no need to use a zero-length check when you are matching the word boundary itself). \b is essentially looking for a non-word character after a word character; so, instead, you could just look for a non-word character in-between the t in first and s in second:

    /first\Wsecond/.match('first second')
    

    This is exactly the same as the first example...but, realistically, you probably just want to match whitespace and can use something like this:

    /first\ssecond/.match('first second')
    

    @WiktorStribiżew's third example shows the best use of word boundaries (at the beginning and end). This is because you aren't matching anything before or after, so a zero-length test is helpful. Otherwise, the above examples could match something like first secondary. In the end, I'd use an expression like:

    /\bfirst\ssecond\b/.match('first second')