为什么\ b有时只使用javascript str.match

时间:2017-03-02 18:33:23

标签: javascript regex

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

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

部分代码看起来像这样,它可以正常工作:

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_count ,告诉我文本中有多少“外国”字。

到目前为止,这么好。但是法国人有问题。

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

var foreign_count = str.match(/\b(le|de|un|à|avec|et|en|je|que|pour|dans|ce|il|qui|ne|sur|se|pas|plus|par)\b/g).length;

但是,如果我删除 \ 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 |杜| INTE | ATT | EN | OCH | HAR | VI | I |汉| VAD | SOM)\ B / G)。长度;

但这样做:

str.match(/ \ B(JAG | DET |杜| INTE | ATT | EN | OCH | HAR | VI | I |汉| VAD | OM)\ B / G)。长度;

似乎某些单词(全部在ascii字符中)会导致错误以及\ b标记。我不能使用(?< = \ s | ^)因为所有帐户都不支持javascript中的lookbehind。

1 个答案:

答案 0 :(得分:1)

这是因为\bdefined

  

匹配单词边界。这是单词字符的位置   没有跟随或先于另一个单词字符,例如   在一封信和一个空格之间。请注意,匹配的单词边界不是   包括在比赛中。换句话说,匹配单词的长度   边界为零。

...以及如何定义字符(又名\w):

  

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

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