Java 正则表达式-大写字母后跟任何utf-8小写字符
我想写一个正则表达式,如果它以IJ开头,后跟utf-8中的任何小写字母,那么它就是有效的Java 正则表达式-大写字母后跟任何utf-8小写字符,java,regex,Java,Regex,我想写一个正则表达式,如果它以IJ开头,后跟utf-8中的任何小写字母,那么它就是有效的 private static String pattern = "^\\u0049\\u004A(\\p{Ll})*"; System.out.println(Pattern.compile(pattern).matcher("IJP").find()); // true 我正在使用这个正则表达式,但它似乎不起作用。对于“IJP”,它不应该匹配,因为P是大写。您的模
private static String pattern = "^\\u0049\\u004A(\\p{Ll})*";
System.out.println(Pattern.compile(pattern).matcher("IJP").find()); // true
我正在使用这个正则表达式,但它似乎不起作用。对于“IJP”,它不应该匹配,因为P是大写。
您的模式应该是:
final String pattern = "^\\u0049\\u004A\\p{Ll}*$";
请注意结尾处的$
位置,使其在结尾前有0个或更多小写字符。注意,我已经删除了\p{Ll}
周围不必要的组
代码演示:
jshell> String pattern = "^\\u0049\\u004A\\p{Ll}*$";
pattern ==> "^\\u0049\\u004A\\p{Ll}*$"
jshell> Pattern.compile(pattern).matcher("IJP").find();
$6 ==> false
\\u0049
是一种相当迟钝的写作方式,你不觉得吗?为什么不。。。写入模式=“^IJ\\p{Ll}”
但IJP确实匹配。想想看。你要的是I,然后是J,然后是0个或更多的小写字母。就在那里:一个I,一个J,还有0个小写字母
使用
matches()
而不是find()
(它会问:整个字符串是否与regexp匹配,而不是“是否有一些子字符串匹配”),或者,正如您已经在其中抛出^
一样,在末尾抛出一个$
来匹配。为了只允许它是IJ,我使用了“^IJ\\p{Ll}*$”,您遗漏的只是$
。使用锚定来确保匹配整个字符串,而不考虑使用的正则表达式方法(find()
或matches()
)。