【问题标题】:How can I escape special characters in regex and Javascript如何转义正则表达式和 Javascript 中的特殊字符
【发布时间】:2023-03-25 07:23:01
【问题描述】:

我正在开发一个简单的聊天机器人,但在使用 .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 在 cmets 中的回答。

【问题讨论】:

  • @Wiktor Stribiżew 感谢您的帮助,基本上,如果用户键入“你好吗?”,我想要它。它将与他们关键的“你好吗”的答案相同 - 我想我需要从这两个值中删除它们?
  • @Wiktor Stribiżew 然后我会打电话给 escapeRegex();以上 hasKeyword = true; ?
  • @Wiktor Stribiżew 我最初是通过拆分它来做到这一点的,但正则表达式似乎更好。这是我以前的代码 - if (userInput.toLowerCase() .replace(/[.,\/#!$%\^&*;:{}=\-_`~ ()]/g,"") 。 split(/\s+/) .includes(key.toLowerCase())) 这有效,但找不到多个单词并在“high”等中选择“hi”。
  • 然后按照我在顶部评论中提到的那样做,也将它们从key.toLowerCase() 中删除。将key.toLowerCase() 替换为key.toLowerCase().replace(/[.,\/#!$%^&amp;*;:{}=\-_`~()]/g,"")。啊,删除空格,我认为您不想删除空格,因为您需要识别多个单词。两个替换必须看起来像.replace(/[.,\/#!$%^&amp;*;:{}=\-_`~()]/g,"")。如果您需要添加反斜杠,请将其加倍,.replace(/[.,\/#!$%^&amp;*;:{}=\-_`~()\\]/g,"")
  • @WiktorStribiżew 非常感谢,它现在可以正常工作了! :) 非常感谢您的耐心和帮助。

标签: javascript regex replace escaping


【解决方案1】:

在这一行:

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

您删除了空格(/[.,\/#!$%\^&amp;\*;:{}=\-_`~ ()]/g 中的字符类中有一个空格)。这就是为什么您的正则表达式(您使用 new RegExp('(^|\\s)'+key.toLowerCase()+'(\\s|$)') 构建的)仅在字符串等于键时才匹配的原因,它期望 key 在空格或字符串的开头/结尾之间。

您需要从替换中删除空格并将此操作应用于输入和键:

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

注意 ^; 不需要转义。我还在特殊的 char 字符类中添加了反斜杠。

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

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2013-12-28
    • 2012-04-18
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多