【问题标题】:Regex to select whole word if part matches如果部分匹配,则正则表达式选择整个单词
【发布时间】:2015-09-01 13:22:49
【问题描述】:

我希望能够在比赛前后选择整个单词...

目前它只选择单词中匹配的部分。所以如果我在"Doglets"这个词中照顾"Dog",它会选择Dog。

我希望它选择 Doglets。如果是这样的话,我也希望它选择letsDog。

return html.replace(new RegExp('(\\b)(' + query + ')(\\b)', 'ig'), "<span class='search-enlight'>$&</span>");

更新:

function filterSearchWords() {
    var query = $("#searchquery").val();

    go(query);
    function go(query) {
        $.extend($.expr[':'], {
            'containsi': function (elem, i, match, array) {
                return (elem.textContent || elem.innerText || '').toLowerCase()
                .indexOf((match[3] || "").toLowerCase()) >= 0;
            }
        });

        $(".search-result p:containsi(" + query + ")").html(function (_, html) {
            return html.replace(new RegExp('(\\b)( \\w*' + query + '\\w*)(\\b)', 'ig'), "<span class='search-enlight'>$&</span>")
        });
        $(".search-result h2 a:containsi(" + query + ")").html(function (_, html) {
            return html.replace(new RegExp('(\\b)( \\w*' + query + '\\w*)(\\b)', 'ig'), "<span class='search-enlight'>$&</span>")
        });
        console.log(query);
    }
}

它现在匹配完整的单词,但是它不匹配大写字母,i 标志似乎不起作用

HTML:

div class="search-result">
                                <span class="thumb" style="font-family: 'draftit'; float: left;">&#xe811;</span>&nbsp;

                                <h2 class="title"><a href="/produkter/malins-testprodukt/skatteavdrag/berakning-av-skatteavdrag/skatteavdrag-nar-skattesedel-inte-har-lamnats/">Skatteavdrag n&#228;r skattesedel inte har l&#228;mnats</a></h2>
                                <p>
                                    Arbetsgivare f&#229;r fr&#229;n Skatteverket besked om hur skatteavdraget f&#246;r respektive anst&#228;lld ska ber&#228;knas. Se avsnittet  tabellavdrag och CSR-f&#246;rfr&#229;gan . Arbetstagaren beh&#246;ver d&#229; inte l...
                                </p>

                            </div>

【问题讨论】:

  • 试试/([^ ]*Dog[^ ]*)/
  • 没有结果:/ @Lauromine
  • @Codehiker 请张贴html!
  • @chsdk 在第一篇文章中发布了 html!
  • p:containsi(" + query + ") 必须是p:contains(" + query + ") 包含后还有一个额外的i,不是吗?

标签: javascript jquery regex


【解决方案1】:

在这种情况下,您需要在正则表达式中包含整个单词,请尝试以下方法:

(\\b)( \\w*'+ query + '\\w*)(\\b)

您的代码将是:

var html = "The Doggy dog is with Doglets and Doggy too!";
var query = "dog";

document.write(html.replace(new RegExp('(\\b)( \\w*' + query + '\\w*)(\\b)', 'ig'), "<span class='search-enlight'>$&</span>"));
.search-enlight {
  background-color: yellow;
  color: red;
}

【讨论】:

  • 那里一定是错字。无法运行它@chsdk
  • 几乎!现在它选择匹配的完整单词,但是它破坏了大小写敏感性。 dog 与 Dog 不匹配。
  • 您希望它区分大小写吗?如果是这样,只需从中删除 i 标志。
  • 不,我不希望它匹配,即使它有大写字母。但事实并非如此。
  • 如果你在我的 sn-p 中看到,它匹配 DogdogDoggy
【解决方案2】:

您可以在被替换之前发布您的 html 示例吗? 原因 /([^ ]Dog[^ ])/ 应该可以工作,但是您的关键字周围的字符串中似乎有一些 \b 所以答案应该是

([^ ]*)(\\bdog\\b)([^ ]*)

对于像这样的字符串

test of \bdog\blet

【讨论】:

  • return html.replace(new RegExp('([^ ]*)(\\'+query +'\\b)([^ ]*)', 'ig'), "$&");根本不工作:(
  • 您在 \\'+query 之后忘记了 b,无论如何您可以发布您的 html 变量的示例吗?谢谢
  • div class="search-result"> &nbsp ;

    Skatteavdrag när skattesedel inte har lämnats

    Arbetsgivare får från Skatteverket besked om hur skatteavdraget för respektive anställd ska

【解决方案3】:

改用这个:\b.*?dog.*?\b

您的表达式的问题是您试图匹配被单词边界包围的query 部分。在前后添加.*? 将指示正则表达式引擎对您感兴趣的子字符串和单词边界之间的其他字符进行非贪婪搜索:

return html.replace(new RegExp('(\\b)(.*?' + query + '.*?)(\\b)', 'ig'), "<span class='search-enlight'>$&</span>");

示例可用here

【讨论】:

  • 这不起作用:return html.replace(new RegExp('\b.*?' +query+'.*?\b', 'ig'), "$&");
  • 实际上.* 会在其中包含空格,因此整个句子都会被占用,并且只有特定的单词。
  • @Codehiker:也许你需要转义\b?在您的示例中,您有 2 个斜杠。
  • @chsdk:这就是为什么有?操作符,从而使*操作符不贪婪。
  • 好的,我现在明白了。
【解决方案4】:

另一种选择:

\w*Dog\w*

Test is here.

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2017-07-08
    相关资源
    最近更新 更多