我有这张桌子。
<input id="emp_search" />
<input id="search" type="button" value="search" />
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>number</th>
<th>letters</th>
<th>Gender</th>
<th>Company</th>
</tr>
<tr>
<td>John</td>
<td>Lennon</td>
<td>151</td>
<td>sf</td>
<td>Male</td>
<td>Corp (Technologies)</td>
</tr>
<tr>
<td>Paul</td>
<td>McCartney</td>
<td>753</td>
<td>tj</td>
<td>Male</td>
<td>Corp (Services)</td>
</tr>
<tr>
<td>George</td>
<td>Harrison</td>
<td>24</td>
<td>ge</td>
<td>Female</td>
<td>Corp Technologies</td>
</tr>
<tr>
<td>Ringo</td>
<td>Starr</td>
<td>26</td>
<td>hg</td>
<td>Female</td>
<td>Corp (Help Desk)</td>
</tr>
</table>
当您搜索“John Paul”或“John Mccartney”等确切字词时,结果应为包含搜索字词的2行。 (现在这是我的jquery的功能,你可以找到多个单词并产生多个确切的结果。
现在我的问题是,当您搜索包含括号的单词时,如“SMS Global(帮助台)”。它甚至都不起作用。
$(function () {
$(' #search ').click(function () {
var str = $('#emp_search').val();
var strary = str.split(' ');
$("table").find("tr").slice(1).each(function (index) {
var text = $.trim($(this).find("td:nth-child(6)").text());
for (var i = 0; i < strary.length; i++) {
console.log("%s:%s", text, strary[i]);
var regex = new RegExp(".*\\b" + strary[i] + "\\b\.*", "gi");
$(this).toggle(regex.test(text));
console.log(regex.test(text));
if (regex.test(text))
break;
}
});
});
});
好的,这是一个解释。让我们说我可以搜索的唯一一列是第一列。你可以在哪里输入john和paul,它们在同一列中。确切的说。所以关于短信全球(技术),我将搜索短信全球(技术)|短信全局(帮助台),并将产生包含正在搜索的单词的两行。
代码有问题吗?我不知道这些代码。我刚发现它。而我正在努力练习和理解它。但是现在我只是一个新的程序员。
答案 0 :(得分:3)
这将帮助您使用括号搜索
见小提琴:CLICK ME
这是代码:
$(function () {
$(' #search ').click(function () {
var str = $('#emp_search').val();
var strary = str.split(' ');
$("table").find("tr").slice(1).each(function (index) {
var text = $.trim($(this).text());
for (var i = 0; i < strary.length; i++) {
console.log("%s:%s", text, strary[i]);
var tempStr;
tempStr = strary[i].replace("(", "\\(");
tempStr = tempStr.replace(")", "\\)");
alert(tempStr);
var regex = new RegExp(".*" + tempStr + ".*", "gi");
$(this).toggle(regex.test(text));
console.log(regex.test(text));
if (regex.test(text)) break;
}
});
});
});
答案 1 :(得分:1)
正则表达式中的paranthesis有两个问题。
首先,parantheses在regexp中具有特殊含义。
为了避免使用特殊字符的困难,您需要逃避这些问题。
以下函数来自stackoverflow问题How to properly escape characters in regexp
function quote(regex) {
return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1');
}
你可以像这样使用它
for (var i = 0; i < strary.length; i++) {
console.log("%s:%s", text, strary[i]);
var regex = new RegExp(".*\\b" + quote(strary[i]) + "\\b\.*", "gi");
$(this).toggle(regex.test(text));
console.log(regex.test(text));
if (regex.test(text)) break;
}
然而,这无法解决您的问题。
因为除了是一个特殊字符'('是一个非单词字符。你的正则表达式搜索单词和非单词字符之间的边界,然后搜索字符串,然后是单词和非单词之间的另一个边界因为'('是非单词字符,空格和'('。
之间没有边界您有几种方法可以解决此问题。 一种方法是从搜索字符串的开头或结尾删除非单词字符。 如果您的字符串以非单词字符开头或结尾,则另一种方法是删除单词边界。 或者,如果字符串以非单词字符开头或结尾,则用非边界字替换单词边界。
ALT1:
function clean(regex) {
var tmp=regexp.replace(/^\W|\W$/g, '');
return "\\b" + tmp.replace(/([()[{*+.$^\\|?])/g, '\\$1') + "\\b";
}
ALT2:
function clean(regex) {
var tmp=regexp.replace(/([()[{*+.$^\\|?])/g, '\\$1');
tmp=tmp.replace(/^((\\)?\w)/, '\\b$1')
tmp=tmp.replace(/((\\)?\w)$/, '$1\\b')
return tmp
}
ALT3:
function clean(regex) {
var tmp=regexp.replace(/([()[{*+.$^\\|?])/g, '\\$1');
tmp = "\\b" + regexp + "\\b"
tmp = tmp.replace(/^\\b((\\)?\W)/,'\\B$1')
tmp=tmp.replace(/((\\)?\W)\\b$/, '$1\\B')
return tmp
}
与
一起使用for (var i = 0; i < strary.length; i++) {
console.log("%s:%s", text, strary[i]);
var regex = new RegExp(clean(strary[i]), "gi");
$(this).toggle(regex.test(text));
console.log(regex.test(text));
if (regex.test(text)) break;
}
注意:以上内容未经过测试,可能包含错误。