我想通过一个例子来解释更容易:
'gracias senor'.match(/\w+/g)
["gracias", "senor"]
但如果我使用任何非英语字符:
'gracias señor'.match(/\w+/g)
["gracias", "se", "or"]
是否有某种方法可以考虑ñ,áé等字符。
答案 0 :(得分:4)
根据Wikipedia,西班牙字母表包括:
A-Z
,a-z
ñ
和Ñ
á
,é
,í
,ó
,ú
,ü
(以及相应的大写字符)由于有两种方法可以指定带变音标记的字符:
á
á
("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
答案 1 :(得分:3)
您可以使用Unicode范围。
'gracias señor'.match(/[\u0080-\u00FF\w]+/g)
Here's a great reference及其转义值。
修改的
所以我回来参考这个,好奇心得到了我的最好。 如何使用一系列字符并确保只使用字母?
以下是使用unicode范围仅返回字母的代码段。使用范围0x0000
- 0x00FF
会返回以下字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ
不确定其准确性,但这是一个有趣的学习实验。
function probablyIsLetter(char) {
var result;
//97-122 == [a-z]
for (var i = 97; i <= 122; i += 1) {
result = char.toLowerCase().localeCompare(String.fromCharCode(i), {
usage: 'search',
sensitivity: 'base'
});
}
return result !== 1;
}
function getFilteredUnicodeRange(start, end) {
var buffer = [];
start = start || 0x0000;
end = end || 0x09FF;
for (var i = start; i <= end; i += 1) {
var char = String.fromCharCode(i);
if (char.toUpperCase() !== char.toLowerCase() && probablyIsLetter(char)) {
buffer.push(char);
}
}
return buffer.join('');
}
var characters = getFilteredUnicodeRange(0x0000, 0x00FF);
var regex = new RegExp('[' + characters + ']+', 'g');
var elementOutput = document.getElementById('example-output');
elementOutput.innerText = 'gracias señor'.match(regex);
var elementRegex = document.getElementById('example-characters');
elementRegex.innerText = characters;
<pre id="example-characters"></pre>
<pre id="example-output"></pre>
答案 2 :(得分:1)
只需这3个字符即可:
'gracias señor'.match(/[\wñáé]+/g);
["gracias", "señor"]
但如果您想在JavaScript中使用完整的Unicode正则表达式功能,请考虑使用XRegExp library。
答案 3 :(得分:-1)
我认为你可以匹配那些在Javascript中使用Unicode令牌的人,比如:
[\u0041-\u017E]*