簡體   English   中英

正則表達式匹配精確單詞不在其他字符之前或之后

[英]Regex match exact word not preceded or followed by other characters

我試圖制作一個匹配一組單詞的正則表達式。

例如,如果我匹配一組單詞 - American Tea

然后在字符串中American Tea is awesome. Do you like American Tea? love WowAmerican Tea #American Tea American Tea is awesome. Do you like American Tea? love WowAmerican Tea #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"]

(第二屆美國茶葉前沒有空間)

使用.replace()獲得樂趣和利潤

/(?:^|\s)(american tea)/ig

https://regex101.com/r/qB0uO2/1

如果你想考慮前綴后綴:

/(?:^|\s)(american tea)(?:\W|$)/ig 

https://regex101.com/r/qB0uO2/2

JSBIN示例

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; 
 <div id="result"></div> 

其中p藝術

  • p1是第一個匹配組(任何前綴)
  • p2是第二個匹配組(“美國茶”字)
  • p3是第三個匹配組(任何后綴)

閱讀評論我意識到正則表達式可能不是最好的解決方案。 然而,你是如何避免Javascript不支持一個積極的lookbehind這一事實,這將使這項任務變得容易。

如果JS有(?<= ...)構造,那么你只需使用一個正面的lookbehind和一個正面的向前看,並列出你想要允許在American Tea左右兩側的所有字符。 所以我們想要的是這樣的:

(?<=\s|\.|,|:|;|\?|\!|^)American Tea(?=\s|\.|,|:|;|\?|\!|$)

在左側,您將允許任何列出的字符和字符串^的開頭。 在右側,您允許相同的字符和字符串$的結尾。

但是Javascript沒有(?<= ...)構造。 所以我們必須有點創意:

(?=(\s|\.|,|:|;|\?|\!|^))\1(American Tea)(?=\s|\.|,|:|;|\?|\!|$)

這個正則表達式以積極的前瞻取代積極的外觀。 然后它與前瞻中發現的任何東西匹配\\ 1,最后美國茶將會捕獲第1組。

演示: https//regex101.com/r/qX9qR3/3

你不需要正則表達式匹配單詞。

我知道一個非常巧妙的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的計算結果為false。

如果您想要匹配的單詞,請使用:

wordList.filter (word) -> ~tweet.indexOf word # returns : [ "talking", "and stuff" ]

或者在JS中也是如此:

wordList.filter(function(word) { // returns : [ "talking", "and stuff" ]
  return ~tweet.indexOf(word);
});

雖然傑里米當然是對的,但我認為你的問題比你人為的例子更明顯。

從它看起來你正試圖有常規的RegEx單詞邊界,除了你認為單詞字符的“#”部分。 在這種情況下,您可以執行以下操作:(其中\\ b表示“單詞邊界”)

(^|[^#])\bAmerican Tea\b

或者,如果您只想列出您認為非單詞字符的字符,則可以執行以下操作來模擬單詞邊界:

(^|[^A-Za-z])American Tea($|[^A-Za-z])

你可以在http://www.regexr.com/上玩游戲

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM