正規表現のビギナーです。分かっていると思えるのは、\bが最初と最後のスペースだけマッチ。/gがグローバルで、一つだけではなく全てマッチする。\wがA-Z,a-z,0-9,_をマッチ。

理解が少し進んだのか、今のところアポストロフィをマッチングするための表現が合っていれば[\']?を入れる場所です。

しかしとすると、var arr = str.match(/\b(\w+|\')\b/g);

[ 'Hell', '\'', 'o', 'World' ]と出力します。

結果として出したいのは['Hell'o', 'World']です。

function countWords(str) {
  var count = 0;
  var arr = str.match(/\b(\w+)[^']\b/g);
  for(var i = 0; i < arr.length; i++){
    if(arr[i] != ""){
      count++;
    }
  }
  return count;
}
countWords("Hell'o World ")