2016-04-26 54 views
1

我想抓住段落中的單詞。由於unicode字符(şöüİıçğ)問題,我不想使用字邊界。所以我使用這樣的正則表達式。我收到錯誤的無效組。有人可以幫忙嗎?Javascript正則表達式捕獲字

var paragraphy= "Bu örnek bir metindir <span>bu</span> metin; test amaçlı yazılmıştır."; 
var word="metin;"; 
var regex = new RegExp("([\\s>]|^)("+word+")(?=([\\.\\,\\;\\?\\!](?=[\\s<])|(?<![\\.\\,\\;\\?\\!])[<\\s]|$))", "gi"); 
console.log(paragraphy.match(regex)); 

我想這個結果:[「倚天」]

+1

'(?<!...)'是一個負面的後顧之眼,JS不支持它。 – anubhava

+0

@anubhava那麼,我能做什麼? – ozen

+1

以上輸入的預期輸出是什麼? – anubhava

回答

1

你可以用這個詞之前([\\s>]|^)組,後(?=[.,;?!\\s<])前瞻簡化邊界檢查。此外,由於您使用的是全局標誌,並且您定義了捕獲組,並且您需要在匹配後訪問它,所以最好在循環中使用RegExp#exec()。另外,如果你在它後面有一些標點符號(在搜索詞裏面),你應該首先擺脫它。如果在這個單詞的末尾只出現,則用word = word.replace(/[,.;?!<]+$/, '')對其進行預處理。

var paragraphy = "Bu örnek bir metindir <span>bu</span> metin; test amaçlı yazılmıştır."; 
 
var word="metin;"; 
 
var regex = new RegExp("([\\s>]|^)("+word.replace(/[,.;?!<]+$/, '')+")(?=[.,;?!\\s<])", "gi"); 
 
res = paragraphy.replace(regex, '$1<span>metin</span>'); 
 
document.body.innerHTML = "<pre>" + res + "</pre>";
span { 
 
    color: #FF0000; 
 
    }

+0

必須是word =「metin;」並且只會產生這個「metin」,所以不會標點符號 – ozen

+0

當你想搜索'metin;'時,沒有機會只返回'metin'。正則表達式不會以這種方式工作 - **您必須在搜索**之前預處理模式*。 –

+0

我嘗試這樣做:paragraphy.replace(正則表達式,' metin');和最終結果:paragraphy =「Buörnekbir metindir bu metin; testamaçlıyazılmıştır。」; – ozen

1

基於上述討論(你的問題如下)您可以使用此replace

var word = "metin"; 
 

 
    var re = new RegExp("(^|[\\s>])(" + word + ")[.,;?!]?(?=[\\s<]|$)", "gi"); 
 

 
    var str = 'Bu örnek bir metindir <span>bu</span> metin; test amaçlı yazılmıştır'; 
 
     
 
    var result = str.replace(re, '$1<span>$2</span>'); 
 

 
    alert(result);

//=> Bu örnek bir metindir <span>bu</span> <span>metin</span> test amaçlı yazılmıştır 

RegEx Demo

+1

謝謝你幫助我,我想。我需要重新考慮所有腳本@anubhava – ozen

+0

您可以考慮標記任何發佈的答案爲已接受。 – anubhava