应该有类似于\w的东西,可以匹配字母或标记类别中的任何代码点(不仅仅是ASCII码),并且希望有像[[P*]]这样的过滤器用于标点符号等。
当前回答
如果您正在使用Babel,那么Unicode支持已经可用。
我还发布了一个转换源代码的插件,这样你就可以编写像/^\p{L}+$/这样的正则表达式。然后将这些转换为浏览器能够理解的内容。
下面是插件的项目页面:
babel-plugin-utf-8-regex
其他回答
由于也没有找到一个好的解决方案,我很久以前写了一个小脚本,从unicode规范(v.5.0.0)下载数据,并为BMP中的每个unicode类别和子类别生成间隔(最近被一个使用自己的原生unicode支持的小Java程序所取代)。
基本上它将\p{…}到一个值范围,很像Tomalak提到的工具的输出,但是间隔可能会非常大(因为它不是处理块,而是处理分散在许多不同地方的字符)。
例如,一个正则表达式是这样写的:
var regex = unicode_hack(/\p{L}(\p{L}|\p{Nd})*/g);
会被转换成这样:
/[\u0041-\u005a\u0061-\u007a...]([...]|[\u0030-\u0039\u0660-\u0669...])*/g
我在实践中没有经常使用它,但从我的测试来看,它似乎工作得很好,所以我在这里发布,以防有人发现它有用。尽管生成的正则表达式很长(上面的示例展开后有3591个字符),但性能似乎是可以接受的(请参阅jsFiddle中的测试;感谢@modiX和@Lwangaman的改进)。
下面是源代码(原始,27.5KB;缩小,24.9KB,没有好到哪里去…)通过不转义unicode字符,它可能会变得更小,但OTOH会有编码问题的风险,所以我就不做改动了。希望在ES6中这种事情不再需要了。
更新:这看起来与Tim Down提到的XRegExp Unicode插件中采用的策略相同,只是在这种情况下使用了常规的JavaScript正则表达式。
如果您正在使用Babel,那么Unicode支持已经可用。
我还发布了一个转换源代码的插件,这样你就可以编写像/^\p{L}+$/这样的正则表达式。然后将这些转换为浏览器能够理解的内容。
下面是插件的项目页面:
babel-plugin-utf-8-regex
[^\u0000-\u007F]+用于不包括ASCII字符的任何字符。
例如:
有趣的功能(s) 归来- [^ \ u0000 \ u007F]。测试(s); 的 控制台日志(isNonLatinCharacters(“身分");/ /日本 控制台日志(isNonLatinCharacters(“测试");/ /中国 控制台日志(isNonLatinCharacters(حمید");/ /波斯语 控制台日志(isNonLatinCharacters(“테스트");/ /韩国 控制台日志(isNonLatinCharacters(परीक्षण");/ /印地语 控制台日志(isNonLatinCharacters(“מִבְחָן");/ /希伯来语
这里有一些完美的参考:
Unicode范围RegExp生成器
Unicode正则表达式
Unicode 10.0字符代码图表
匹配Unicode块范围
在JavaScript中,\w和\d是ASCII,而\s是Unicode。别问我为什么。JavaScript支持带有Unicode类别的\p,您可以使用它来模拟支持Unicode的\w和\d。
\d使用\p{N}(数字)
[\p{L}\p{N}\p{Pc}\p{M}](字母,数字,下划线,标记)
更新:不幸的是,我错了。JavaScript也不正式支持\p,尽管一些实现可能仍然支持它。JavaScript正则表达式中对Unicode的唯一支持是使用\uFFFF匹配特定的代码点。你可以在字符类的范围内使用它们。
这样就可以了:
/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')
它显式地选择一个unicode字符范围。 它将适用于拉丁字符,但其他奇怪的字符可能超出这个范围。
推荐文章
- 检测用户何时离开网页的最佳方法?
- 当“模糊”事件发生时,我如何才能找到哪个元素的焦点去了*到*?
- React不会加载本地图像
- 如何将Blob转换为JavaScript文件
- 在另一个js文件中调用JavaScript函数
- 如何在svg元素中使用z索引?
- 如何求一个数的长度?
- 跨源请求头(CORS)与PHP头
- 如何用Express/Node以编程方式发送404响应?
- parseInt(null, 24) === 23…等等,什么?
- JavaScript变量声明在循环外还是循环内?
- Ruby正则表达式中\A \z和^ $的区别
- 元素在“for(…in…)”循环中排序
- 在哪里放置JavaScript在HTML文件?
- 什么时候.then(success, fail)被认为是承诺的反模式?