应该有类似于\w的东西,可以匹配字母或标记类别中的任何代码点(不仅仅是ASCII码),并且希望有像[[P*]]这样的过滤器用于标点符号等。
当前回答
由于也没有找到一个好的解决方案,我很久以前写了一个小脚本,从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正则表达式。
其他回答
这样就可以了:
/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')
它显式地选择一个unicode字符范围。 它将适用于拉丁字符,但其他奇怪的字符可能超出这个范围。
由于也没有找到一个好的解决方案,我很久以前写了一个小脚本,从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正则表达式。
2018年9月(2019年2月更新)
regexp /\p{L}/u用于匹配字母(作为unicode类别)
适用于Chrome 68.0.3440.106和Safari 11.1.2 (13605.3.8) 不能在Firefox 65.0上工作:(
下面是一个工作示例
在下面的字段,你应该能够键入字母,但不是数字<br> <input type="text" name="field" onkeydown="return /\p{L}/u.test(event.key)">
我在这里报告这个错误。
更新
经过超过2年的时间:1500035 > 1361876 > 1634135终于修复了这个错误,将在Firefox v.78+中可用
如果您正在使用Babel,那么Unicode支持已经可用。
我还发布了一个转换源代码的插件,这样你就可以编写像/^\p{L}+$/这样的正则表达式。然后将这些转换为浏览器能够理解的内容。
下面是插件的项目页面:
babel-plugin-utf-8-regex
正如在其他回答中提到的,JavaScript正则表达式不支持Unicode字符类。但是,有一个库确实提供了这一点:Steven Levithan的优秀XRegExp及其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)被认为是承诺的反模式?