28

我有一个用于在 textarea 字段中进行字数统计的 jQuery 函数。此外,它排除了所有在 [[[三方括号]]] 中封闭的单词。它适用于拉丁字符,但它对西里尔语句子有问题。我想该错误部分与正则表达式有关:

$(field).val().replace(/\[\[\[[^\]]*\]\]\]/g, '').match(/\b/g);

两种短语的示例:http: //jsfiddle.net/A3cEG/2/

我需要计算所有单词,包括西里尔语表达,而不仅仅是拉丁语单词。怎么做?

4

4 回答 4

53

JavaScript(至少是最广泛使用的版本)不完全支持 Unicode。即\w只匹配拉丁字母、十进制数字和下划线( [a-zA-Z0-9_]),\b匹配单词字符与非单词字符的边界。

要使用拉丁文或西里尔文查找输入字符串中的所有单词,您必须执行以下操作:

.match(/[\wа-я]+/ig); // where а is the Cyrillic а.

或者,如果您愿意:

.match(/[\w\u0430-\u044f]+/ig);

当然这可能意味着你需要稍微调整你的代码,因为这里它将匹配所有单词而不是单词边界。请注意,与此处[а-я]所述的“基本西里尔字母”中的任何字母匹配。要匹配此范围之外的字母,您可以根据需要修改字符集以包含这些字母,例如,为了也匹配俄语 Ё/ё,使用.[а-яё]

另请注意,您的三括号模式可以简化为:

.replace(/\[{3}[^]]*]{3}/g, '')

或者,您可能想查看XRegExp项目(这是一个开源项目,用于向基本 JavaScript 正则表达式引擎添加新功能)及其Unicode插件。

于 2013-08-27T17:01:23.777 回答
8

请注意使用西里尔字母范围,其中可能包含不必要的字符。有防弹正则表达式只包含西里尔字母:

/^[аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ]+$/
于 2018-10-26T10:21:25.110 回答
1

您可以添加/u标志,它允许您使用 Unicode。

添加此标志时,您的示例将起作用。

于 2020-08-13T11:56:03.217 回答
0

除了最受好评的答案之外,您也可以这样做:

.match(/[\w\p{sc=Cyrillic}]+/ug);

你可以在这里阅读更多关于它的信息。

于 2022-01-23T01:12:12.770 回答