为什么\b有时仅适用于javascript str.match

为什么\b有时仅适用于javascript str.match,javascript,regex,Javascript,Regex,我有一个javascript函数,它试图识别一段文本的语言,并查看是否与特定语言匹配 例如,我将函数发送为“意大利语”,它试图查看文本是否包含一定数量的非常常见的意大利语单词 代码的一部分如下所示,它工作得非常好: switch ( defLanguage ) { case "Italian": var foreign_count = str.match(/\b(non|di|che|è|e|la|il|un|a|per|in|una|mi|sono|ho|ma|l'|l

我有一个javascript函数,它试图识别一段文本的语言,并查看是否与特定语言匹配

例如,我将函数发送为“意大利语”,它试图查看文本是否包含一定数量的非常常见的意大利语单词

代码的一部分如下所示,它工作得非常好:

switch ( defLanguage ) {
    case "Italian":
        var foreign_count = str.match(/\b(non|di|che|è|e|la|il|un|a|per|in|una|mi|sono|ho|ma|l'|lo|ha|le)\b/g).length;
        break;
    case "German":
        var foreign_count = str.match(/\b(das|ist|Sie|ich|nicht|die|es|und|der|was|ein|zu|er|in|sie|mir|mit|den|auf|mich)\b/g).length;
        break;
}
这将返回foreign\u count,它告诉我文本中有多少“foreign”单词

到目前为止,一切顺利。但是法语有个问题

如果我将\b单词边界放在可能的单词周围,它将不起作用(即javascript从此停止)

但是,如果我删除\b,则它确实有效

var foreign_count = str.match(/(le|de|un|à|avec|et|en|je|que|pour|dans|ce|il|qui|ne|sur|se|pas|plus|par)/g).length;
这真让我抓狂。\b适用于德语和意大利语(以及其他语言)示例,但不适用于法语。我一辈子都搞不清楚为什么,很明显我需要这个词的边界,所以我需要解决这个问题

任何帮助都将不胜感激

======更多信息========

问题似乎与非ascii字符无关

这不起作用:

str.match(/\b(jag | det | du | inte | att | en | och | har | vi | i | han | vad | som)b/g)长度

但这确实:

str.match(/\b(jag | det | du | inte | att | en | och | har | vi | i | han | vad | om)b/g)长度


某些单词(全部使用ascii字符)似乎与\b标记一起导致错误。我不能使用(?这是因为
\b
是:

匹配单词边界。这是单词字符的位置 不在另一个单词字符的后面或前面,例如 在字母和空格之间。请注意,匹配的单词边界不是 包含在匹配中。换句话说,匹配单词的长度 边界为零

…以及如何定义单词字符(aka
\w
):

匹配基本拉丁字母表中的任何字母数字字符, 包括下划线。相当于[A-Za-z0-9]


显然,
a
不是一个单词字符,因此它无法帮助匹配单词边界。

进一步说,希腊文在有或没有\b的情况下都不起作用。可能发生的情况是,您的正则表达式遇到非ASCII字符时会失败。请看,可能会有帮助。哦,这也变得很奇怪。如果正则表达式是str.match(/\b(in)\b/g).length则有效,但如果是str.match(/\b(dans)\b/g)。length则无效!dans字符是否有问题?我尝试了较长的单词列表,但总是落在这些单词上。使用空白边界代替
(?),问题解决了!
var foreign_count = str.match(/(le|de|un|à|avec|et|en|je|que|pour|dans|ce|il|qui|ne|sur|se|pas|plus|par)/g).length;