如何转义正则表达式和 Javascript 中的特殊字符

How can I escape special characters in regex and Javascript

我正在开发一个简单的聊天机器人,但在使用 .replace 转义特殊字符时遇到了一些问题 - 我可能遗漏了一些明显的内容,但下面的代码不起作用,我也不知道为什么。有什么想法吗?

澄清一下,这段代码可以正常工作,并且可以在没有 .replace 行的情况下完成我想要它做的事情,但我需要它,所以如果用户输入 ?要么 !等没关系。

    var know = {
<!--General Phrases-->  
"Hi": "Hello! &#128075",
"Hey": "Hello! &#128075",
"Hello":"Hello &#128075 How can I help?",    
"how are you":"Not bad, thanks!",
"Bye":"Have a nice day!",
"Goodbye":"See you later!", 

<!--Directory-->
"Help": `You can find help by searching below or by clicking <a href='https://www.page.com/news' target="_blank">here</a>`,
"contact":  `You can contact us by clicking <a href='https://www.page.com/contact' target="_blank">here</a>`,
"About": `You can find our About Us page by clicking <a href='https://www.page.com/about' target="_blank">here</a>` 
};

function goo() {
 var userBox = document.getElementById('userBox');
 var userInput = userBox.value;
 var chatLog = document.getElementById('chatLog');
 var chatLogContent = "";

 if (!userInput) {
     chatLogContent = ''
 }

 var hasKeyword = false;

 for (var key in know) {
      if (userInput.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~ ()]/g,"").match(new RegExp('(^|\s)'+key.toLowerCase()+'(\s|$)')))  {{
          hasKeyword = true;
          break;
      } else {
          hasKeyword = false;
      }
 }

if (hasKeyword) {
    chatLogContent += know[key] + "<br>"; //or use know.key
} else {
    chatLogContent += "No results found. Please enter another search term below.<br>";
}

var server = document.createElement('div');
server.setAttribute('class', 'server');
server.innerHTML = chatLogContent;
document.getElementById('chatLog').innerHTML = '';
chatLog.appendChild(server);
}

更新:已解决。请在评论中查看 Wiktor Stribiżew 的回答。

这一行:

if (userInput.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~ ()]/g,"").match(new RegExp('(^|\s)'+key.toLowerCase()+'(\s|$)')))  {{

你删除了spaces(/[.,\/#!$%\^&\*;:{}=\-_`~ ()]/g中的字符class中有一个space。这就是为什么你的正则表达式(你用 new RegExp('(^|\s)'+key.toLowerCase()+'(\s|$)') 构建的)只在字符串等于键时才匹配,它期望 key 在 whitespaces 或 start/end 之间字符串.

您需要从替换中删除 space 并在输入和键上应用此操作:

if (userInput.replace(/[.,\/#!$%^&*;:{}=\-_`~()\]/g,"").match(new RegExp('(^|\s)'+key.replace(/[.,\/#!$%^&*;:{}=\-_`~()\]/g,"")+'(\s|$)', 'i')))  {{

注意^;不需要转义。我还向特殊字符 class.

添加了反斜杠

请注意,无需将大小写调小,您只需将 i 不区分大小写的标志传递给正则表达式即可。