我想用一个例子更容易解释:
'gracias senor'.match(/\w+/g)
["gracias", "senor"]
但是如果我使用任何非英文字符:
'gracias señor'.match(/\w+/g)
["gracias", "se", "or"]
有什么方法可以考虑 ñ、á é 等字符。
最佳答案
根据 Wikipedia , 西类牙字母表包括:
- 英文字母表:
A-Z
,a-z
- N 带变音波浪号:
ñ
和Ñ
- 重音字符:
á
、é
、í
、ó
、ú
,ü
(及其对应的大写字符)
因为有两种方法可以指定带变音符号的字符:
- 单个字形:
á
- 带有组合标记:
á
("a\u0341"
)
您至少需要处理此类情况。值得庆幸的是,西类牙语字符上最多只有 1 个变音符号。
在 Unicode 中,也有分解为英文字母 A-Z
或 a-z
的字符。由于 JavaScript 的 RegExp 对 Unicode 的支持很差,而且它们很少被使用,所以我忽略了这些情况。
因此,要正确匹配西类牙字母表(单个字形和组合标记):
[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ]
(注意 i
标志对非 US-ASCII 字符无效)。
回到匹配单词的问题。这取决于您对“单词字符”的定义。
假设一个“单词”(西类牙语)由西类牙语字母表和数字 0-9
组成:
(?:[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ0-9])+
测试代码:
'gracias señor señor'.match(/(?:[aeiouAEIOU]\u0341|[uU]\u0308|[nN]\u0303|[a-zA-ZáéíóúüÁÉÍÓÚÜñÑ0-9])+/g).forEach(function(v){console.log(v + " " + v.length)});
输出(匹配的单词和长度):
gracias 7
señor 5
señor 6
关于javascript - 使用 javascript 在正则表达式中使用语言环境字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21520594/