我试图制作匹配一组单词的正则表达式。
例如,如果我匹配一组单词 - American Tea
然后在字符串American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea
中,这里只有2个匹配,
'美国茶很棒。你喜欢美国茶吗?喜欢WowAmerican Tea #American Tea'
所以,我试图只完成单词集的完整匹配。
我尝试了一些方法,但没有得到正确的正则表达式:( 如果有人可以提供帮助,或者可以指出我的方向,那将非常有帮助。
检查
'American Tea lalalal qwqwqw American Tea sdsdsd #American Tea'.match(/(?:^|\s)(American Tea)(?=\s|$)/g)
结果是["American Tea", " American Tea"]
我不希望第二场比赛中有空格,我希望比赛结果为["American Tea", "American Tea"]
(第二美国茶前没有空间)
答案 0 :(得分:2)
使用.replace()获取乐趣和利润
/(?:^|\s)(american tea)/ig
https://regex101.com/r/qB0uO2/1
如果您想考虑前缀 AND 后缀:
/(?:^|\s)(american tea)(?:\W|$)/ig
https://regex101.com/r/qB0uO2/2
<强> JSBIN EXAMPLE 强>
var str = "American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea";
str.replace(/(?:^|\s)(american tea)(?:\W|$)/ig, function(i, m){
console.log(m);
});
//"American Tea"
//"American Tea"
<强> 编辑: 强>
上面只返回匹配项,如果您希望保留捕获和匹配前缀和后缀使用 capture-groups 以及:
var str = "American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea";
var newStr = str.replace(/(^|\s)(american tea)(\W|$)/ig, function(im, p1, p2, p3){
return p1 +"<b>"+ p2 +"</b>"+ p3; // p1 and p3 will help preserve the pref/suffix
});
document.getElementById("result").innerHTML = newStr;
&#13;
<div id="result"></div>
&#13;
p
艺术
p1
是第一个匹配的组(任何前缀)p2
是第二个匹配组(&#34;美国茶&#34;字)p3
是第三个匹配组(任何后缀)答案 1 :(得分:0)
阅读评论我意识到正则表达式可能不是最佳解决方案。然而,你是如何避免这样一个事实,即你如何避免Javascript不支持一个积极的lookbehind,这将使这项任务变得容易。
如果JS有(?&lt; = ...)构造,那么你只需要使用正面的lookbehind和一个正面的向前看,并列出你想要允许在American Tea左右两侧的所有字符。所以我们想要的是这样的:
(?<=\s|\.|,|:|;|\?|\!|^)American Tea(?=\s|\.|,|:|;|\?|\!|$)
在左侧,您将允许任何列出的字符和字符串的开头^。在右侧,您允许相同的字符和字符串$的结尾。
但是Javascript没有(?&lt; = ...)构造。所以我们必须要有点创意:
(?=(\s|\.|,|:|;|\?|\!|^))\1(American Tea)(?=\s|\.|,|:|;|\?|\!|$)
这个正则表达式以积极的前瞻取代积极的外观。然后它匹配前瞻中发现的任何内容\ 1,最后美国茶将会捕获第1组。
答案 2 :(得分:0)
您不需要正则表达式来匹配单词。
我知道一个非常简洁的CoffeeScript片段:
wordList = ["coffeescript", "eko", "talking", "play framework", "and stuff", "falsy"]
tweet = "This is an example tweet talking about javascript and stuff."
wordList.some (word) -> ~tweet.indexOf word # returns true
编译成以下javascript:
var tweet, wordList;
wordList = ["coffeescript", "eko", "talking", "play framework", "and stuff", "falsy"];
tweet = "This is an example tweet talking about javascript and stuff.";
wordList.some(function(word) { // returns true
return ~tweet.indexOf(word);
});
〜不是CoffeeScript中的特殊操作符,只是一个很酷的技巧。它是按位NOT运算符,它反转其操作数的位。在实践中,它等同于-x-1。这里它的工作原理是我们要检查大于-1的索引, - ( - 1)-1 == 0的计算结果为假。
如果您想要匹配的单词,请使用:
wordList.filter (word) -> ~tweet.indexOf word # returns : [ "talking", "and stuff" ]
在JS中也是如此:
wordList.filter(function(word) { // returns : [ "talking", "and stuff" ]
return ~tweet.indexOf(word);
});
答案 3 :(得分:0)
虽然杰里米当然是对的,但我认为你的问题比你人为的例子更明显。
从看起来你看起来你正试图使用常规的RegEx单词边界,除了你认为单词字符的“#”部分。在这种情况下,您可以执行以下操作:(其中\ b表示“单词边界”)
tidy = TRUE
或者,如果您只想列出您认为非单词字符的字符,可以执行以下操作来模拟单词边界:
(^|[^#])\bAmerican Tea\b
你可以玩耍,例如在http://www.regexr.com/