2016-04-26 81 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