2010-11-18 146 views
4

我想強調一組使用JavaScript和正則表達式的關鍵字,我面臨着一個問題,我的關鍵字可以包含文字和特殊字符作爲@Text #NUMBER等等。我使用單詞邊界來匹配和替換整個單詞而不是一個部分單詞(包含在另一個單詞中)。正則表達式表達在JavaScript

var pattern = new regex('\b '(+ keyword +')\b',gi); 

這裏這個表達式匹配整個關鍵字,並強調他們,但在情況下,如果像「號:」任何關鍵字沒有得到強調。

我知道\bword\b爲字邊界和特殊字符匹配是非字母數字字符因此不通過上述表達式匹配。 你能讓我知道我可以用什麼正則表達式來完成上述任務。

== 更新 ==

對於上面我試着添Pietzcker對下面的正則表達式的建議,

expr: (?:^|\\b|\\s)(" + keyword + ")(?:$|\\b|\\s) 

上面似乎是工作讓我的對手整個字與字母數字和非字母數字字符,但是每當關鍵字有連續的HTML標籤之前或不帶空格的關鍵字後,它並沒有突出的關鍵字(如社會保障* 號: < BR> *) 我嘗試以下的正則表達式,但它取代了HTML標記關鍵字

expr: (?:^|\b|\s|<[^>]+>)number:(?:$|\b|\s|<[^>]+>) 

這裏爲關鍵字號前面:具有<br>(空間有意添加爲BR標籤以避免瀏覽器解釋標籤)在下一個沒有空格的地方會突出顯示關鍵字。

您能否提供這將忽略與字母數字和非字母數字字符整個單詞連續的HTML標記的表達。

+1

如果您有搜索的關鍵字,爲什麼要使用正則表達式?只要搜索字符串。 – 2010-11-18 11:30:39

+0

[正則表達式使用字邊界在JavaScript中匹配字母數字和非字母數字字符]的可能重複(http://stackoverflow.com/questions/4214204/regex-expression-using-word-boundary-for-matching-alphanumeric-and -non-alphanumer) – Pointy 2010-11-18 14:22:09

+0

from [tchrist](http://stackoverflow.com/users/471272/tchrist)[鏈接回覆](http://stackoverflow.com/a/4215752/576767):「請看看[這個答案](http://stackoverflow.com/questions/4213800/is-there-something-like-a-counter-variable-in-regular-expression-replace/4214173#4214173)爲微妙的陷阱,隨之而來使用\ b和\ B作爲邊界。「 – 2015-05-13 21:52:47

回答

0

也許你正在試圖做的是

'\b\W*(' + keyword + ')\W*\b' 
0

前瞻和回顧後是你的答案:"(?=<[\s^])" + keyword + "(?=[\s$])"。括號中的位不包含在匹配中,因此在那裏包含關鍵字中不允許使用的字符。

+0

哎呀,我的錯誤... JavaScript不支持回顧後(儘管它支持先行出於某種原因)。忽視。 – 2010-11-18 11:37:42

1

我們需要尋找一個在兩邊都有空格字符的子字符串。如果JavaScript的支持回顧後,這將是這樣的:

var re = new RegExp('(?<!\\S)' + keyword + '(?!\\S)', 'gi'); 

這不會工作,雖然(但會在Perl和其他腳本語言)。相反,我們需要包括領先的空白字符(或字符串的開頭)隨着比賽的開始部分(以及可選的捕捉我們真正尋找到$ 1):

var re = new RegExp('(?:^|\\s)(' + keyword + ')(?!\\S)', 'gi'); 

剛認爲, 真實的地方其中任何比賽開始將一個字符什麼是由re.exec(string)返回.index屬性返回,並且如果您正在訪問匹配的字符串,您可能需要與.slice(1)刪除第一個字符或簡單地訪問之後什麼被捕獲。

2

好的,所以你有兩個問題:JavaScript不支持逆向查找,\b只能找到字母數字字符和非字母數字字符之間的界限。

第一個問題:究竟確實爲構成了您的關鍵字的單詞邊界?我的猜測是它必須是\b邊界或空白。如果是這樣的話,你可以搜索

"(?:^|\\b|\\s)(" + keyword + ")(?:$|\\b|\\s)" 

當然的空白字符周圍像@number#關鍵詞也將成爲比賽的一部分,但也許這些突出是沒有這樣的問題。在其他情況下,我。即如果存在可以匹配的實際字邊界,則空格不會成爲匹配的一部分,因此在大多數情況下它應該可以正常工作。

您感興趣的實際單詞將在反向引用#1中,所以如果您可以單獨突出顯示,則更好。

編輯: 如果後/關鍵字之前,那麼我認爲你可以做(​​如果你堅持使用JavaScript)的唯一事情是可能發生的其他字符不是空間:

  1. 檢查您的關鍵字以一個alnum角色開始。
  2. 如果是這樣,請在您的正則表達式前加上\b
  3. 檢查您的關鍵字是否以alnum字符結尾。
  4. 如果是這樣,請將\b附加到您的正則表達式中。

因此,對於keyword,使用\bkeyword\b;對於number:,使用\bnumber:;對於@twitter,請使用@twitter\b

+0

上述內容似乎是爲了讓我匹配字母數字和非字母數字字符的整個單詞,然而無論何時關鍵字在關鍵字之前或之後都有連續的html標記,它都不會突出顯示該關鍵字(例如,社會安全號碼:
)。你可以讓我知道如何忽略這些html標籤(可以是任何)我試過以下的正則表達式,但它取代了關鍵字 – Bhupen 2010-11-18 14:10:58

+0

expr之前的html標籤:(?:^ | \ b | \ s | <[^>] +> )number:(?:$ | \ b | \ s | <[^>] +>) – Bhupen 2010-11-18 14:12:04

0

正如蒂姆正確指出的那樣,\b是一些棘手的事情,其工作方式與人們通常認爲他們工作的方式不同。請閱讀this answer瞭解有關此事的更多詳情,以及您可以對此做些什麼。

簡單地說,這是對左側的邊界:

(?(?=\w)(?<!\w)|(?<!\W)) 

,這是正確的邊界:

(?(?<=\w)(?!\w)|(?!\W)) 

人們總是覺得有參與空間,但不是活得噸。但是,現在你已經知道了真正的定義,很容易將它構建到它們中。在上述兩種模式中,人們可以將\w\W替換爲\s\S。或者可以在其他塊中添加空白感知。