在ActionScript正则表达式中指定Unicode范围

3
我一直在尝试编写一个正则表达式,匹配所有Unicode单词字符,类似于:
/[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\w]/gi

但是这种方法完全失败了,没有匹配到任何内容。我尝试了各种表达式,似乎只要指定范围就会失败。有人比我更幸运吗?

我希望ActionScript能够提供类似于\p{L}的东西,但如果有类似的内容,我在文档中找不到它。

3个回答

3
您可以使用String.fromCharCode与Unicode字符一起使用,然后在正则表达式中正确地处理范围。以下是使用您原始问题的示例:
var exp:RegExp = new RegExp("[" + generateRangeForUnicodeVariables(0x00A0, 0xD7FF) + generateRangeForUnicodeVariables(0xF900, 0xFDCF) + generateRangeForUnicodeVariables(0xFDF0, 0xFFEF) + "\w]", "gi");

private function generateRangeForUnicodeVariables(var1:Object, var2:Object):String
{
   return String.fromCharCode(var1) + "-" + String.fromCharCode(var2);
}

1
我已经寻找了很长时间的Flash特定解决方案,以查找Unicode十六进制范围(用于表情符号)。尝试了许多正则表达式后,我很高兴地报告说,您的方法在我的实现中完美地运行。终于找到了。 - 1owk3y

1
这是一个长期存在的问题,我找不到任何信息表明它已经解决。之前在以下链接中提出过类似问题: 限制输入为指定语言如何在RegExp中指定Unicode范围? 我知道这是一种hack方法,但它确实可以在JavaScript中工作,因此您可以使用ExternalInterface将测试传递给外部并将结果传回来。

如果您要按照我的方法,这里有一个链接可帮助在JavaScript中构建正则表达式模式:http://kourge.net/projects/regexp-unicode-block。 - Neil
我之前没有想到ExternalInterface,这是一个非常好的主意!我的当前解决方案也不少于一个hack,因为我只是循环遍历我的(短)字符串,检查每个字符是否在白名单中,并在它们不匹配时将它们删除。 - Bastien

0

嗯。看起来不是关于范围的问题,而是关于多字节字符的。

这个可以正常工作:

 var exp:RegExp = new RegExp("[\u00A0-\u0FCF]", "gi");
 var str:String = "\u00A1 \u00A2 \u00A3 \u00A3";
 trace("subject:", str);
 trace("match:", str.match(exp));

这个不行:

 var exp:RegExp = new RegExp("[\u00A0-\u0FD0]", "gi");
 var str:String = "\u00A1 \u00A2 \u00A3 \u00A3";
 trace("subject:", str);
 trace("match:", str.match(exp));

无论如何,您都可以使用RegExp构造函数将字符串转换为匹配模式。

你可以使用RegExp构造函数将字符串转换为匹配模式 - 很有趣,你能详细说明一下吗? - Bastien
嗯...这就是我在测试中使用new RegExp("[\u00A0-\u0FD0]", "gi")实际上所做的。然而,我不知道为什么对于代码超过\u0FCF的字符,范围无法按预期工作。 - Michael Antipin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接