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

时间:2014-02-03 05:52:07

标签: javascript regex locale

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

'gracias senor'.match(/\w+/g)
["gracias", "senor"]

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

'gracias señor'.match(/\w+/g)
["gracias", "se", "or"]

是否有某种方法可以考虑ñ,áé等字符。

4 个答案:

答案 0 :(得分:4)

根据Wikipedia,西班牙字母表包括:

  • 英文字母:A-Za-z
  • N with diacritic tilde:ñÑ
  • 重音字符:áéíóúü(以及相应的大写字符)

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

  • 单个字形:á
  • 使用组合标记:"a\u0341"

您至少需要处理此类案件。值得庆幸的是,西班牙语在角色上只有至少1个变音符号。

在Unicode中,还有一些字符可以分解为英文字母A-Za-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)

Unicode范围的

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]*