正则表达式在表中用括号查找单词

时间:2013-12-02 09:26:54

标签: javascript jquery regex

我有这张桌子。

<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,它们在同一列中。确切的说。所以关于短信全球(技术),我将搜索短信全球(技术)|短信全局(帮助台),并将产生包含正在搜索的单词的两行。

JSFiddle

代码有问题吗?我不知道这些代码。我刚发现它。而我正在努力练习和理解它。但是现在我只是一个新的程序员。

2 个答案:

答案 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;
            }
        });
    });

});

enter image description here

答案 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;
}

注意:以上内容未经过测试,可能包含错误。