语言代码剥离正则表达式
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 也能正确处理不同的语言环境字符串。
我觉得我已经很接近这里的解决方案了,但我似乎不太明白。我的目标是一次获取一组字符串 [ '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 也能正确处理不同的语言环境字符串。