如何转义正则表达式和 Javascript 中的特殊字符
How can I escape special characters in regex and Javascript
我正在开发一个简单的聊天机器人,但在使用 .replace 转义特殊字符时遇到了一些问题 - 我可能遗漏了一些明显的内容,但下面的代码不起作用,我也不知道为什么。有什么想法吗?
澄清一下,这段代码可以正常工作,并且可以在没有 .replace 行的情况下完成我想要它做的事情,但我需要它,所以如果用户输入 ?要么 !等没关系。
var know = {
<!--General Phrases-->
"Hi": "Hello! 👋",
"Hey": "Hello! 👋",
"Hello":"Hello 👋 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
不区分大小写的标志传递给正则表达式即可。
我正在开发一个简单的聊天机器人,但在使用 .replace 转义特殊字符时遇到了一些问题 - 我可能遗漏了一些明显的内容,但下面的代码不起作用,我也不知道为什么。有什么想法吗?
澄清一下,这段代码可以正常工作,并且可以在没有 .replace 行的情况下完成我想要它做的事情,但我需要它,所以如果用户输入 ?要么 !等没关系。
var know = {
<!--General Phrases-->
"Hi": "Hello! 👋",
"Hey": "Hello! 👋",
"Hello":"Hello 👋 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
不区分大小写的标志传递给正则表达式即可。