ruby on rails - Why can't regular expressions match for @ sign? -


for string be there @ six.

why work:

str.gsub! /\bsix\b/i, "seven" 

but trying replace @ sign doesn't match:

str.gsub! /\b@\b/i, "at" 

escaping doesn't seem work either:

str.gsub! /\b\@\b/i, "at" 

this down how \b interpreted. \b "word boundary", wherein zero-length match occurs if \b preceded or followed word character. word characters limited [a-za-z0-9_] , maybe few other things, @ not word character, \b won't match before (and after space). space not boundary.

more word boundaries...

if need replace @ surrounding whitespace, can capture after \b , use backreferences. captures preceding whitespace \s* zero or more space characters.

str.gsub! /\b(\s*)@(\s*)\b/i, "\\1at\\2" => "be there @ six" 

or insist upon whitespace, use \s+ instead of \s*.

str = "be there @ six." str.gsub! /\b(\s+)@(\s+)\b/i, "\\1at\\2" => "be there @ six."  # no match without whitespace... str = "be there@six." str.gsub! /\b(\s+)@(\s+)\b/i, "\\1at\\2" => nil 

at point, we're starting introduce redundancies forcing use of \b. done /(\w+\s+)@(\s+\w+)/, foregoing \b match \w word characters followed \s whitespace.

update after comments:

if want treat @ "word" may appear @ beginning or end, or inside bounded whitespace, may use \w match "non-word" characters, combined ^$ anchors "or" pipe |:

# replace @ @ start, middle, before punctuation str = "@ there @ 6 @." str.gsub! /(^|\w+)@(\w+|$)/, '\\1at\\2' => "at there @ 6 at." 

(^|\w+) matches either ^ start of string, or sequence of non-word characters (like whitespace or punctuation). (\w+|$) similar can match end of string $.


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -