You can change your regex to:
keywords = keywords.match(/\w+|"(?:\\"|[^"])+"/g);
Instead of [^"]+ you’ve got (?:\\"|[^"])+ which allows \" or other character, but not an unescaped quote.
One important note is that if you want the string to include a literal slash, it should be:
keywords="pop rock "hard rock" "\\"dream\\" pop""; //note the escaped slashes.
Also, there’s a slight inconsistency between \w+ and [^"]+ – for example, it will match the word "ab*d", but not ab*d (without quotes). Consider using [^"\s]+ instead, that will match non-spaces.