Java 多字节字符串的正则表达式

Java 多字节字符串的正则表达式,java,regex,Java,Regex,检测多字节字符串的正则表达式可能是什么 例如,下面是用于检测英语字符串的表达式 Pattern p=Pattern.compile("[a-zA-Z/]"); 类似地,我想要一个有多个字节的模式,比如 コメント_1050_固-減価償却費 对于非英语语言的元素,您需要使用Unicode。链接应该为您提供一些信息 对UniCode正则表达式有一个很好的介绍。本质上,Java正则表达式处理字符串,而不是字节数组-字符表示为抽象的“字符”实体,而不是某些特定编码中的字节。这并非完全正确,因为char类

检测多字节字符串的正则表达式可能是什么

例如,下面是用于检测英语字符串的表达式

Pattern p=Pattern.compile("[a-zA-Z/]");
类似地,我想要一个有多个字节的模式,比如

コメント_1050_固-減価償却費


对于非英语语言的元素,您需要使用
Unicode
。链接应该为您提供一些信息

对UniCode正则表达式有一个很好的介绍。

本质上,Java正则表达式处理字符串,而不是字节数组-字符表示为抽象的“字符”实体,而不是某些特定编码中的字节。这并非完全正确,因为
char
类型仅包含基本多语言平面中的字符,并且此范围之外的Unicode字符分别表示为两个
char
值,但“多字节”是相对的,取决于编码

如果您需要的是“UTF-8中的多字节”,那么请注意,在此编码中只有值为0-127的字符是单字节。因此,最简单的检查方法是使用循环并检查每个字符-如果大于127,则在UTF-8中超过一个字节


如果您坚持使用正则表达式,您可能会在正则表达式中使用字符范围操作符,如下所示:
[\u0080-\uFFFF]
(尚未选中并且
\uFFFF
不是真正的字符,但我认为正则表达式引擎应该接受它)。

您可能想看看

我认为基本上您需要Unicode属性
\p{L}
。这将匹配任何具有属性“letter”的代码点

所以你的正则表达式看起来像这样

Pattern p=Pattern.compile("[\\p{L}/]");
我刚刚用
\p{L}


由于Java 7,您还可以使用
Pattern.UNICODE\u CHARACTER\u类

启用预定义字符类和POSIX字符类的Unicode版本

这将把预定义的
\w
转换为Unicode版本,这意味着它将匹配所有Unicode字母和数字(以及连接字符的字符串,如

所以要匹配字符串
コメント_1050_固-減価償却費,您可以使用

Pattern p=Pattern.compile("^\\w+$", Pattern.UNICODE_CHARACTER_CLASS);
这将匹配由字母、数字和数字组成的任何字符串_

这里是对Unicode脚本、属性和块的概述


关于Java中正则表达式的注意事项,包括更新的Java 7(或Java 8)中已更改的内容。

如果要检测是否有多字节字符串,可以查看长度

if (text.length() != text.getBytes(encoding).length)

这将检测到任何编码都使用了多字节字符。

AFAIK,在Java UCS-2中使用,即所有字符串都是多字节的。您可以输入带有char
code>127的符号,就像正常形式的拉丁符号一样:
以及以下形式:
\u30FC
它没有其他一些建议那么快,但它更一般,您可以确定它的作用。但是我尝试了以下JRE 8代码,它仍然是错误的:字符串输入=”