【问题标题】:regex find words with parenthesis in table正则表达式在表格中查找带括号的单词
【发布时间】:2013-12-02 09:26:54
【问题描述】:

我有这张桌子。

<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 (Help Desk)”等括号的单词时。它甚至不起作用。

$(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 ,它们位于同一列中。和确切的词。所以关于 sms global(技术),我将搜索 sms global(技术)|sms global(帮助台),并会得到包含正在搜索的单词的两行。

JSFiddle

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

【问题讨论】:

  • 可以消除第二个循环......jsfiddle.net/arunpjohny/5kqEt/1 仍然) 不起作用
  • @Vincent 是的!不是正则表达式的人....所以不知道为什么
  • stackoverflow.com/a/2593661/1225328 会解决你的问题。
  • @sp00m 仅仅转义正则表达式是不够的。 /.*\b\(technologies\)\b.*/ 与 SMS Global(技术)不匹配。
  • @Vincent 那么你需要戴上思考帽,告诉我们为什么“John Paul”应该匹配 2 行,而不是没有,而“sms global (technologies)”应该匹配 1 行,而不是大于 4。即。是什么让第一个东西应该匹配任何单词,而后者应该匹配整个短语。

标签: javascript jquery regex


【解决方案1】:

这将帮助您使用括号进行搜索

见小提琴: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;
            }
        });
    });

});

【讨论】:

  • 这解决了括号的问题,但不能解决其他正则表达式特殊字符的问题。上面@sp00m 的评论有一个更好的解决方案的链接。
  • @squeamishossifrage 该链接没有给出完整的答案,因为 OP 的正则表达式按单词边界搜索,并且空格和 '(' 之间没有边界。所以只是转义是不够的。请参阅我的回复。
【解决方案2】:

您的正则表达式中的括号有两个问题。

首先是括号在正则表达式中具有特殊含义。

为了避免特殊字符的困难,您需要对这些字符进行转义。

以下函数摘自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;
}

但是这并不能解决您的问题。

因为除了是一个特殊字符'('是一个非单词字符。你的正则表达式搜索单词和非单词字符之间的边界,然后是搜索字符串,然后是单词和非单词之间的另一个边界word。因为 '(' 是一个非单词字符,所以空格和 '(' 之间没有界限。

您有几种方法可以解决此问题。 一种是从搜索字符串的开头或结尾删除非单词字符。 如果您的字符串以非单词字符开头或结尾,另一种方法是删除单词边界。 或者如果字符串以非单词字符开头或结尾,则将单词边界替换为单词非边界。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多