为什么\b有时仅适用于javascript str.match
我有一个javascript函数,它试图识别一段文本的语言,并查看是否与特定语言匹配 例如,我将函数发送为“意大利语”,它试图查看文本是否包含一定数量的非常常见的意大利语单词 代码的一部分如下所示,它工作得非常好:为什么\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
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;