Multi Bytes字符串的正则表达式

时间:2012-03-29 07:19:52

标签: java regex

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

例如,这里是用英语

检测字符串的表达式
Pattern p=Pattern.compile("[a-zA-Z/]");

同样,我想要一个具有多字节的模式,如

  

コメント_1050_固 - 减価偿却费

5 个答案:

答案 0 :(得分:3)

您可能需要查看Unicode Support in Java

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

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

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

我刚用a-zA-Z

替换了字符范围\p{L}

从Java 7开始,您也可以使用Pattern.UNICODE_CHARACTER_CLASS

  

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

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

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

Pattern p=Pattern.compile("^\\w+$", Pattern.UNICODE_CHARACTER_CLASS);

这将匹配由字母,数字和_

组成的任何字符串

请参阅here for more details

并在regular-expression.info上概述了Unicode脚本,属性和块。

See here a famous answer from tchrist关于Java中正则表达式的注意事项,包括使用Java 7(或将在Java 8中)更改的更新内容

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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