我觉得我在这里非常接近解决方案,但我似乎无法弄明白。我的目标是一次一个地使用一组字符串[ 'en', 'en-us', 'en_us', 'zh-hans-TW' ]
并生成[ 'en', 'en', 'en', 'zh-hans' ]
。我尝试了一些不同的东西,但没有合适的解决方案。
我相信,这是我最接近的所有人,除了'
。 /([a-zA-Z-_]+)[-_].+/
(一个或多个a-zZ字符或-_后跟 - 或_和其他字符)
我尝试了否定前瞻(我并不擅长),并想出了匹配并捕获整个字符串的内容
/([a-zA-Z-_]+)(?![-_].+)/
(一个或多个aA-zZ字符或-_后面没有 - 或_附加字符)
有人可以在这里指出正确的解决方案吗?
答案 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也会正确处理不同的语言环境字符串。