语言代码剥离正则表达式

Language Code Stripping Regex

我觉得我已经很接近这里的解决方案了,但我似乎不太明白。我的目标是一次获取一组字符串 [ 'en', 'en-us', 'en_us', 'zh-hans-TW' ] 并生成 [ 'en', 'en', 'en', 'zh-hans' ]。我尝试了几种不同的方法,但没有找到完全正确的解决方案。

这是我最接近的,我相信,除了 'en'。

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

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

/([a-zA-Z-_]+)(?![-_].+)/
(一个或多个 aA-zZ 字符或 -_ 后面不跟 - 或 _ 以及其他字符)

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

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

/[-_][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' ]

你应该尽量笼统一些。例如,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,它有几种解析区域设置代码的方法并找到 "best" 一个。但是,浏览器支持是有限的。因此,您可能想要寻找现成的东西。但我现在什么也不能指手画脚。

JED 库使用 the following regexp 提取段:

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

但随后假定第二个部分(如果存在)始终是国家/地区,因此此逻辑在 zh-hans-TW 上会失败。

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