检测多字节字符串的正则表达式是什么。
例如,这里是用英语
检测字符串的表达式Pattern p=Pattern.compile("[a-zA-Z/]");
同样,我想要一个具有多字节的模式,如
コメント_1050_固 - 减価偿却费
答案 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);
这将匹配由字母,数字和_
组成的任何字符串并在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有一个很好的介绍。