Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于匹配Unicode模式的正则表达式_Java_Regex - Fatal编程技术网

Java 用于匹配Unicode模式的正则表达式

Java 用于匹配Unicode模式的正则表达式,java,regex,Java,Regex,我试图在上传文件时验证文件的内容,但我被Unicode编码卡住了。我对查找不在ASCII范围内的Unicode特殊字符不感兴趣。我正在尝试查找文件内容是否至少包含一个Unicode模式,例如\u0046 例如,我排除了任何包含“script”单词的文件,但是如果该文件包含这个用Unicode编写的单词呢?当然,Java在读取内容时会将其解码为普通字符串,但是如果我不能依赖它呢 所以,就我在互联网上的搜索而言,我看到过类似于\u0046或U+0046的Unicode字符。基于此,我编写了以下正则表

我试图在上传文件时验证文件的内容,但我被Unicode编码卡住了。我对查找不在ASCII范围内的Unicode特殊字符不感兴趣。我正在尝试查找文件内容是否至少包含一个Unicode模式,例如\u0046

例如,我排除了任何包含“script”单词的文件,但是如果该文件包含这个用Unicode编写的单词呢?当然,Java在读取内容时会将其解码为普通字符串,但是如果我不能依赖它呢

所以,就我在互联网上的搜索而言,我看到过类似于\u0046或U+0046的Unicode字符。基于此,我编写了以下正则表达式:

(\\u|U\+)....
这意味着,\u或u+后跟四个字符。这个模式实现了我的愿望,但我想知道是否还有其他方法来编写Unicode字符。它总是\u或u+?在\u或u+之后可以多于或少于4个字符吗

谢谢

属于Unicode的符号U+任何数量的十六进制数字在代码中都不起作用。在java源代码和*.properties
\u
中,后跟四个十六进制数字是自动解析的Unicode UTF-16编码

要搜索的模式:

"\\\\u[0-9A-Fa-f]{4}"
或字符串。包含在:

"\\u"

对于完整的UTF-32范围,可以使用Java以外的其他语言(六个十六进制字符)。不幸的是,对于Java 8,情况并非如此。

不确定您想要实现什么。例如,还有XML字符转义,如
和#160
和无数其他转义字符的方法。我必须搜索字符串中的Unicode字符,但不能搜索Unicode代码的含义。例如,U+0061是“a”字母,但我不想匹配字母本身,而是匹配Unicode序列(代码)的外观。因此,如果文件内容中出现任何类似U+0061或\u0061的序列,我必须阻止该文件。所以我想知道我是否可以为这个创建一个模式。返回一步。什么是危险的在很大程度上取决于文件的类型(即以后如何使用),而不是实际内容。例如,U+0046在大多数情况下是无害的。因此,您希望通过此验证实现什么是有趣的。您要检查哪些文件,…我已经对文件的内容进行了一些其他验证。我有一些模式可以发现url、导入、src、脚本、javascript等的错误用法。文件的内容被保存,然后重命名并像定制css一样加载到我们的应用程序中。我的客户要求我根本不支持Unicode,所以我正在努力找到解决方案。我看到,当我阅读内容时,Java会解码一系列Unicode字符,如果这是一个坏单词,它可能无法通过其他验证,但我仍然必须排除Unicode:)我仍然不相信这是一种有效的方法,但请记住这一警告,您的模式很好,但U+后面可以跟4位以上,例如U+10FFFF如何编写正则表达式来匹配这样的模式\ude08yo?“yo'是连接到unicode'\ude08'的单词,我需要一种方法来将它们分开,知道吗?@AmeenMaheen我想\ude08是一个低代理字符,一对字符组成一个高unicode代码点。(我可能会出错。)下面的高级代理字符的两个字节永远不会被编码(由UTF-16)为两个ASCII字节“yo”-因此我无能为力。现在我解决了这个问题,使用java库中一个名为StringEscapeUtils的类来转义文本。现在这不是问题