正则表达式表达不符合预期

时间:2017-08-31 15:21:08

标签: javascript regex string

我想测试字符串是否包含单词。 所以,我有这个正则表达式:/\bde\b/gi

而且,如果我的字符串是“Comidadecão”,它就可以了。

但是,如果我有一个像“Necessidade de adeus depois”这样的字符串,它也会匹配“mustidade”,“adeus”和“depois”中的“de”。

此外,当我尝试在像“éavida”这样的字符串中匹配带有重音符号的单词时,使用这样的正则表达式:/\bé\b/gi没有找到任何内容。 但是,如果我在中间搜索一个带有重音的单词,就会找到它!所以在字符串“Onível”中如果我使用以下正则表达式/\bnível\b/gi  它匹配正确的词。

我一直在寻找类似的问题,但我仍然无法解决我的问题。

顺便说一下,here第一个问题没有发生,它按预期工作。

谢谢!

编辑:添加了我的代码

var myRe = new RegExp("\\b" + query + "\\b","iu");
var match = myRe.test("Necessidade de adeus depois");

1 个答案:

答案 0 :(得分:1)

我发现的最接近工作的是这个。就像我的评论中所述,字边界和unicode字符似乎存在问题。

我认为这个解决方案可以改进,但它使用积极的前瞻(不消耗字符)来测试字符串的开始^或结束$,或者如果不是字符:

//accent as a word end or start
/(?=^|\W)é(?=$|\W)/giu

//no accent as a word end or start
/\bnível\b/giu

编辑:是的,这是真的,不适用于多个字符..如果你可以测试你想要测试的长度,你仍然可以根据你搜索1个或多个字符来制作不同的情况

EDIT2:实际上最后编辑错了。它不依赖于长度,但重音字符是否接近边界。所以“éternel”为/(?=^|\W)éternel\b/giu,“né”为/\bné(?=$|\W)/giu

更新了正则表达式示例:https://regex101.com/r/6v2gId/3

EDIT3:我尝试过的一个小例子,回答你的最后评论:

var query = 'de';
var myRe = new RegExp("\\b" + query + "\\b","giu");
var match = myRe.test("determinado de necessidade de comer é de");
document.getElementById('res1').innerHTML = match;
var match = myRe.test("determinado necessidade comer é e");
document.getElementById('res2').innerHTML = match;
var query = 'dé';
var myRe = new RegExp("\\b" + query + "(?=$|\\W)","giu");
var match = myRe.test("déterminado dé necessidadé de comer é de");
document.getElementById('res3').innerHTML = match;
var match = myRe.test("déterminado necessidadé comer é de");
document.getElementById('res4').innerHTML = match;
<span>test with "\\bde\\b":</span><br/>
<span>for "determinado de necessidade de comer é de":</span><span id="res1"></span><br/>
<span>for "determinado necessidade comer é e":</span><span id="res2"></span><br/><br/>
<span>test with "\\bdé(?=$|\\W)":</span><br/>
<span>for "déterminado dé necessidadé de comer é de":</span><span id="res3"></span><br/>
<span>for "déterminado necessidadé comer é de":</span><span id="res4"></span>