语言代码剥离正则表达式

时间:2015-03-03 22:29:50

标签: javascript regex regex-lookarounds

我觉得我在这里非常接近解决方案,但我似乎无法弄明白。我的目标是一次一个地使用一组字符串[ 'en', 'en-us', 'en_us', 'zh-hans-TW' ]并生成[ 'en', 'en', 'en', 'zh-hans' ]。我尝试了一些不同的东西,但没有合适的解决方案。

我相信,这是我最接近的所有人,除了'

/([a-zA-Z-_]+)[-_].+/
(一个或多个a-zZ字符或-_后跟 - 或_和其他字符)

我尝试了否定前瞻(我并不擅长),并想出了匹配并捕获整个字符串的内容

/([a-zA-Z-_]+)(?![-_].+)/
(一个或多个aA-zZ字符或-_后面没有 - 或_附加字符)

有人可以在这里指出正确的解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以删除不想保留的字符串末尾,而不是匹配您希望保留的字符串部分:

/[-_][a-z]+$/i

以下是Javascript中的实现:

var array1 = [ 'en', 'en-us', 'en_us', 'zh-hans-TW' ];

var array2 = array1.map(function(str) {
  return str.replace(/[-_][a-z]+$/i, "");
});

console.log(array2);

输出:

[ 'en', 'en', 'en', 'zh-hans' ]

答案 1 :(得分:1)

你应该尝试更一般。例如,de-DE-u-co-phonebk也是有效的语言代码(以-u...开头的内容表示整理顺序的Unicode选项等)。我假设你想要从国家代码开始剥离一切,按标准应该是大写的。如果你想用正则表达式做到这一点,那么

function strip_country_code(lang) { return lang.replace(/[-_][A-Z][A-Z].*$/, ''); }

当然,这将在en-us上失败,这是无效的;它应该是en-US。您必须决定是否以及如何处理此类无效语言代码。

这只是一个原因,如果可能的话,最好使用可用的库来处理语言代码。看看JS internationalization API,它有几种方法可以解析区域设置代码并找到“最佳”区域代码。但是,浏览器支持有限。所以你可能想要寻找现成的东西。但是我现在无法指责任何事情。

JED库使用the following regexp来提取片段:

str.match(/[a-z]+/gi)

但是假设第二个段(如果存在)始终是国家/地区,因此{J}会失败{/ 1}}。

您还应该考虑谁将消耗您的字符串操作的结果。您是说有一些库或API可以处理国家/地区代码之前的语言环境字符串部分?你应该确保事实确实如此。例如,我相信moment.js也会正确处理不同的语言环境字符串。