应该有类似于\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插件。