我想用一个例子更容易解释:

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

但是,如果我使用任何非英文字符:
'gracias señor'.match(/\w+/g)
["gracias", "se", "or"]

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

最佳答案

根据Wikipedia,西类牙语字母包括:

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

  • 由于有两种方法可以用变音符指定字符:
  • 单个字形:á
  • 带有组合标记:("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
    

    关于javascript - 使用javascript在正则表达式中使用区域设置字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21520594/

    10-12 17:29
    查看更多