javascript正则表达式测试()不识别丹麦字符

时间:2014-08-17 23:06:38

标签: javascript regex unicode

我使用javascript和正则表达式创建了一个搜索功能,就像使用自动完成功能的facebooks搜索字段一样。 这样可以正常工作,但是当我搜索丹麦字母Æ,Ø,Å时,.test()函数将无法正确识别它并且不返回任何内容。

这基本上是搜索部分的工作方式:

var regXSearch = "\\b"+sTerm;
//sTerm is the value of my search field       
var regX = new RegExp(regXSearch,"gi");
var nameCheck = regX.test(users[i]["User"]["name"]);

想象一下用户名asbjørn,østergård和jason:

  • 如果我搜索“asbjør”,“asb”或甚至“ørn”将返回true。
  • 如果我搜索“øster”或“østergård”,它将返回false。
  • 如果我搜索“stergård”,“ård”或甚至“rd”它将返回true
  • 如果我搜索“j”,“jas”,“jaso”等它将返回true
  • 如果我搜索“ason”或“son”,它将返回false

我找到了一个实际上可以用æøå搜索的小提琴,但它只在搜索整个单词时才有效。我不能解释它是如何工作的,但也许你可以使用它来找到我的问题的可能修复:http://jsfiddle.net/8Y3cM/17/

这是可修复的还是我需要切换到某种插件搜索功能?

2 个答案:

答案 0 :(得分:2)

你的问题是双重的。

首先 \b 匹配其位置上的分词。单词中断匹配时,在其中一侧有单词字符,而在另一侧有非单词字符。您的正则表达式以"\\b"+sTerm开头,因此jason\bason上的\bson会失败,但会匹配\bj\bjas和{ {1}}。如果没有什么'在\bjaso的左侧,它会被视为'而不是单词字符' (没有单词字符,请参阅?:),在失败的情况下,那里的东西,而在Match情况下没有。

第二次:字符\bø 被认为"字符"在Javascript中,这个简单的测试会告诉你:

å

由于它们不被视为单词字符,alert ("østergård".match(/\W+/g)); 的行为与您认为的行为相反:

\b

失败是因为alert ("østergård".match(/\bøster/)); // null 在其右侧看到了一个无字字符(\b),所以它应该匹配左边的字符(它没有,没有什么有)。

针对您的样本案例的小型测试套件:

ø

显示与您报告的var sTerm = [ [ "asbjørn", "asbjør", "asb", "ørn" ], [ "østergård", "øster", "østergård" ], [ "østergård", "stergård", "ård", "rd" ], [ "jason", "j", "jas", "jaso" ], [ "jason", "ason", "son" ] ]; var r = ''; for (s=0; s<sTerm.length; s++) { for (s2=1; s2<sTerm[s].length; s2++) { var regXSearch = "\\b"+sTerm[s][s2]; //sTerm is the value of my search field var regX = new RegExp(regXSearch,"gi"); var nameCheck = regX.test(sTerm[s][0]); r += "["+sTerm[s][s2]+"] on ["+sTerm[s][0]+"] is "+nameCheck+'\r'; } } alert (r); true相同的顺序。如果您移除false中的\b,则会看到所有返回regXSearch

为什么你自己的临时修复&#39;修好了吗?

您使用有效的单词字符替换非单词字符(没有任何个人信息,这只是根据Javascript!),因此您可以获得true的预期行为。

更好的解决方法是不要依赖\b的这种特定行为(以及\b)。如果这些用户名可能出现在任何文本的任何位置(因此不仅仅是在字符串的开头),您可以使用以下内容:

\w

RegEx

var regXSearch = "(^|[^\\wøå])"+sTerm;

代表

  • (^|[^\\wøå]) 字符串的开头
  • ^
  • | NOT([^...])任意字符^\wø

答案 1 :(得分:0)

我能够通过让两个不同的变量包含同一组用户来进行临时修复 - 一个包含æøå的真实姓名,另一个包含替换值。 (用于查看搜索功能)

如果有人遇到类似的问题,替换字符的功能如下:

var mapObj = { æ:"ae", ø:"oe", å:"aa", Æ:"AE", Ø:"OE", Å:"AA" };

               sTerm = sTerm.replace(/æ|ø|å|Æ|Ø|Å/gi, function(matched){
                    return mapObj[matched];
             });

如果有人有更好的解决方案,我仍然感兴趣。 :)