使用javascript在正则表达式中使用区域设置字符

ope*_*sas 6 javascript regex locale

我想通过一个例子来解释更容易:

'gracias senor'.match(/\w+/g)
["gracias", "senor"]
Run Code Online (Sandbox Code Playgroud)

但如果我使用任何非英语字符:

'gracias señor'.match(/\w+/g)
["gracias", "se", "or"]
Run Code Online (Sandbox Code Playgroud)

有没有办法考虑ñ,áé等字符.

nha*_*tdh 5

根据维基百科,西班牙语字母包括:

  • 英文字母:A-Z,a-z
  • N 带变音符号波浪号:ñÑ
  • 重音字符:á, é, í, ó, ú, ü(及其对应的大写字符)

由于有两种方法可以指定带有变音符号的字符:

  • 单字形: á
  • 随着组合标志:a?"a\u0341"

您至少需要处理此类情况。值得庆幸的是,西班牙语的字符上最多只有 1 个变音标记。

在 Unicode 中,也有分解为英文字母A-Za-z. 由于 JavaScript 的 RegExp 对 Unicode 的支持很差,而且它们很少使用,所以我忽略了这些情况。

因此,要正确匹配西班牙字母表(单个字形和组合标记):

[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ]
Run Code Online (Sandbox Code Playgroud)

(请注意,i标志对非 US-ASCII 字符无效)。


回到匹配单词的问题。这取决于您对“单词字符”的定义。

假设一个“单词”(西班牙语)由西班牙语字母和数字组成0-9

(?:[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ0-9])+
Run Code Online (Sandbox Code Playgroud)

测试代码:

'gracias señor sen?or'.match(/(?:[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ0-9])+/g).forEach(function(v){console.log(v + " " + v.length)});
Run Code Online (Sandbox Code Playgroud)

输出(匹配字和长度):

gracias 7
señor 5
sen?or 6
Run Code Online (Sandbox Code Playgroud)