声明:以下纯属个人见解和总结,可能存在理解错误的地方,如有发现敬请指出,不胜感激。
概念:以一个特殊的字符串来描述一个格式,让程序按照这个格式去验证字符串,那么用于描述格式的这个字符串就是正则表达式。正则表达是只规定格式,不规定内容。
验证一个字符串是否满足一个正则表达式的方法:boolean str.matches(String regex);
正则表达式常用语法
1、" () "和" [] "的使用
// "()"表示把括号中的内容看作整体匹配 String regex1 = "(ABC)"; System.out.println("A".matches(regex1));// false System.out.println("ABC".matches(regex1));// true System.out.println("ABCDEFG".matches(regex1));// false System.out.println("ABCABC".matches(regex1));// false // "[]"表示匹配括号中的字符任选其一 String regex2 = "[ABC]"; System.out.println("A".matches(regex2));// true System.out.println("B".matches(regex2));// true System.out.println("C".matches(regex2));// true System.out.println("AB".matches(regex2));// false System.out.println("ABC".matches(regex2));//false System.out.println("ABCDEFG".matches(regex2));// false System.out.println("ABCABC".matches(regex2));// false
2、" ^ "的使用
在一些资料中," ^ "被介绍成"匹配输入字符串的开始位置"。
但是我在java代码中的使用过程和测试中发现:如果" ^ "不是出现在" [] " 中,没有实际的意义,当出现在" [] "中是表示"非"的意思。
String regex1 = "ABC"; System.out.println("A".matches(regex1));// false System.out.println("BC".matches(regex1));// false System.out.println("ABC".matches(regex1));// true System.out.println("ABCABC".matches(regex1));// false System.out.println("ABCDEFG".matches(regex1));// false System.out.println("DDD ABC".matches(regex1));// false // "^"在这里没有实际的意义,结果与上面相同 String regex2 = "^ABC"; System.out.println("A".matches(regex2));// false System.out.println("BC".matches(regex2));// false System.out.println("ABC".matches(regex2));// true System.out.println("ABCABC".matches(regex2));// false System.out.println("ABCDEFG".matches(regex2));// false System.out.println("DDD EFG".matches(regex2));// false // "^"在这里没有意义 String regex3 = "(^ABC)"; System.out.println("A".matches(regex3));// false System.out.println("BC".matches(regex3));// false System.out.println("ABC".matches(regex3));// true System.out.println("DBC".matches(regex3));// false System.out.println("EFG".matches(regex3));// false System.out.println("ABCDEFG".matches(regex3));// false // "^"在这里表示"非"的意思,表示除A,B,C意外的任意一个字符 String regex4 = "[^ABC]"; System.out.println("A".matches(regex4));// false System.out.println("B".matches(regex4));// false System.out.println("C".matches(regex4));// false System.out.println("BC".matches(regex4));// false System.out.println("ABC".matches(regex4));// false System.out.println("D".matches(regex4));// true System.out.println("E".matches(regex4));// true System.out.println("\n".matches(regex4));// true
3、" | "的使用
在上面的介绍中,我们知道" ^ "可以表示"非",同样我们还可以在正则表达式中使用" | "(或)。
" | "或使用示例:
String regex1 = "A|B|C"; System.out.println("".matches(regex1));// false System.out.println("A".matches(regex1));// true System.out.println("B".matches(regex1));// true System.out.println("C".matches(regex1));// true System.out.println("D".matches(regex1));// false System.out.println("AB".matches(regex1));// false String regex2 = "[ABC]|(DEF)"; System.out.println("".matches(regex2));// false System.out.println("A".matches(regex2));// true System.out.println("B".matches(regex2));// true System.out.println("C".matches(regex2));// true System.out.println("AB".matches(regex2));// false System.out.println("ABC".matches(regex2));// false System.out.println("D".matches(regex2));// false System.out.println("DEF".matches(regex2));// true System.out.println("ABCDEF".matches(regex2));// false
这时候有人可能会问" || "这个或行不行,在正则表达式中" || "可以使用,但是会被当作两个" | "使用,而且中间是一个长度为0的字符串。
String regex3 = "A||B||C"; // 注意,这时的"".matches(regex3)结果为true,而上面的例子中结果为false System.out.println("".matches(regex3));// true System.out.println("A".matches(regex3));// true System.out.println("B".matches(regex3));// true System.out.println("C".matches(regex3));// true System.out.println("D".matches(regex3));// false System.out.println("AB".matches(regex3));// false
4、正则表达式的区间表示
通过使用" [] "可以表示区间、范围,或者可以说是一个简写,具体通过如下的实例进行理解。
[a-z]:只能出现一个小写英文字母,a-z表示一项,只不过是一个范围。
[0-9]:只能出现一个数字。
[a-zA-Z0-9]:描述一个字符,可以是任意数字或字母。
[^0-9]:只能出现一个非数字的字符。
5、" && "的使用
在上面的内容中介绍了"或"和"非"的使用,有人会问,正则表达式中是否可以使用"与"。
答案是肯定的,但是"与"的使用比"或"和"非"比较难于理解,最简单的方法就是将" && "理解成为交集。
" && "使用示例:
// 任意一个小写字母的集合 与 任意一个非b、c字符的集合 的交集 // 即得到集合{a,d,e,f,g,h,i,j,kl,m,n,o,p,q,r,s,t,u,v,w,x,y,z} String regex1 = "[a-z&&[^bc]]"; System.out.println("----------" + regex1 + "----------"); System.out.println("a".matches(regex1));// true System.out.println("b".matches(regex1));// false System.out.println("d".matches(regex1));// true System.out.println("\n".matches(regex1));// false // 任意一个小写字母的集合 与 集合{d,A,B,C}的交集 // 即得到集合{d,f} String regex2 = "[a-z&&[defABC]]"; System.out.println("----------" + regex2 + "----------"); System.out.println("a".matches(regex2));// false System.out.println("d".matches(regex2));// true System.out.println("e".matches(regex2));// true System.out.println("f".matches(regex2));// true System.out.println("g".matches(regex2));// false System.out.println("A".matches(regex2));// false // 任意一个小写字母 与 任意一个数字 的交集 // 得到一个空集,所以任何字符串进行校验都是返回false String regex3 = "[a-z&&0-9]"; System.out.println("----------" + regex3 + "----------"); System.out.println("".matches(regex3));// false System.out.println("a".matches(regex3));// false System.out.println("0".matches(regex3));// false System.out.println("a&&0".matches(regex3));// false System.out.println("a-z&&0-9".matches(regex3));// false System.out.println("[a-z&&0-9]".matches(regex3));// false
" && "必须出现在" [] "中才有意义,否则就是普通的字符串"&&"。
// 这里"&&"并不是"与"的意思,而是表示字符&& String regex4 = "A&&B"; System.out.println("A&&B".matches(regex4));// true String regex5 = "(ABC)&&(DEF)"; System.out.println("ABC&&DEF".matches(regex5));// true String regex6 = "[ABC]&&[DEF]"; System.out.println("A&&D".matches(regex6));// true System.out.println("B&&D".matches(regex6));// true
6、正则表达式中的量词
在正则表达式中常用的量词有如下几个:
?:表示前面的内容出现0-1次
*:表示前面的内容出现0-任意次
+:表示前面的内容出现1-任意次
{n}:表示前面的内容出现n次
{n,m}:表示出现最少n次,最多m次
{n,}:表示出现n次以上
使用示例:
// "?"表示前面的内容出现0-1次 String regex1 = "A?"; System.out.println("".matches(regex1));// true System.out.println("A".matches(regex1));// true System.out.println("AA".matches(regex1));// false System.out.println("AB".matches(regex1));// false System.out.println("B".matches(regex1));// false // "*"表示前面的内容出现0-任意次 String regex2 = "A*"; System.out.println("".matches(regex2));// true System.out.println("A".matches(regex2));// true System.out.println("AA".matches(regex2));// true System.out.println("AB".matches(regex2));// false System.out.println("B".matches(regex2));// false // "+"表示前面的内容出现1-任意次 String regex3 = "A+"; System.out.println("".matches(regex3));// false System.out.println("A".matches(regex3));// true System.out.println("AA".matches(regex3));// true System.out.println("AB".matches(regex3));// false System.out.println("B".matches(regex3));// false // "{n}"表示前面的内容出现n次 String regex4 = "A{2}"; System.out.println("".matches(regex4));// false System.out.println("A".matches(regex4));// false System.out.println("AA".matches(regex4));// true System.out.println("AAA".matches(regex4));// false System.out.println("BAA".matches(regex4));// false // "{n,m}"表示出现最少n次,最多m次 String regex5 = "A{2,4}"; System.out.println("A".matches(regex5));// false System.out.println("AA".matches(regex5));// true System.out.println("AAA".matches(regex5));// true System.out.println("AAAA".matches(regex5));// true System.out.println("AAAAA".matches(regex5));// false System.out.println("AAB".matches(regex5));// false // "{n,}"表示出现n次以上 String regex6 = "A{2,}"; System.out.println("A".matches(regex6));// false System.out.println("AA".matches(regex6));// true System.out.println("AAA".matches(regex6));// true System.out.println("AAAA".matches(regex6));// true System.out.println("AAAAA".matches(regex6));// true System.out.println("BAA".matches(regex6));// false
7、正则表达式中常用的元字符
其实在上面介绍的" ^ "," | "," () "," [] "," ? "," * "," + "," {} "都是正则表达式中的元字符。这里再介绍一些常用的元字符。
.:用来描述除了"\n"之外的任意一个字符
\d:描述任意一个数字,等同于[0-9]
\D:描述任意一个非数字字符,等同[^0-9],[^\d]
\s:任意一个空白字符,例如空格,\t,\n等
\S:描述任意一个非空白字符
\w:任意一个单词字符,等同[a-zA-Z_0-9]
\W:任意一个非单词字符,等同[^\w]
注意:由于元字符在正则表达式中有特殊的含义,java编译器在编译是会将第一个"\"作为转义字符,所以我们在使用带有"\"的元字符时,需要使用"\\"。
使用示例:
String regex1 = "."; System.out.println("A".matches(regex1));// true System.out.println("\t".matches(regex1));// true System.out.println("\b".matches(regex1));// true System.out.println("\n".matches(regex1));// false System.out.println("a".matches(regex1));// true System.out.println(".".matches(regex1));// true String regex2 = "\\d"; System.out.println("A".matches(regex2));// false System.out.println("0".matches(regex2));// true String regex3 = "\\D"; System.out.println("A".matches(regex3));// true System.out.println("0".matches(regex3));// false System.out.println("\n".matches(regex3));// true String regex4 = "\\s"; // 这是一个空格 System.out.println(" ".matches(regex4));// true System.out.println("\t".matches(regex4));// true System.out.println("\n".matches(regex4));// true System.out.println("A".matches(regex4));// false String regex5 = "\\S"; System.out.println(" ".matches(regex5));// false System.out.println("\t".matches(regex5));// false System.out.println("A".matches(regex5));// true System.out.println(".".matches(regex5));// true String regex6 = "\\w"; System.out.println("A".matches(regex6));// true System.out.println("a".matches(regex6));// true System.out.println("0".matches(regex6));// true System.out.println("_".matches(regex6));// true System.out.println(".".matches(regex6));// false String regex7 = "\\W"; System.out.println("A".matches(regex7));// false System.out.println("a".matches(regex7));// false System.out.println("0".matches(regex7));// false System.out.println("_".matches(regex7));// false System.out.println(".".matches(regex7));// true System.out.println("\n".matches(regex7));// true
如果在正则表达式中需要匹配" ^ "," ? "," * "," + "," () "," [] "," . "等元字符,我们需要使用"\"进行转义。
由于java编译器在编译时会将第一个"\"作为转义字符转义,所以我们需要使用"\\"。
// String regex1 = "\^";// 编译错误 String regex1 = "\\^"; System.out.println("^".matches(regex1));// true String regex2 = "\\(\\)"; System.out.println("()".matches(regex2));// true String regex3 = "\\."; System.out.println(".".matches(regex3));// true String regex4 = "\\{\\}"; System.out.println("{}".matches(regex4));// true
8、在正则表达式中可以使用Unicode字符
例如:
// 判断一个字符串是否全是中文 String regex = "[\u4e00-\u9fa5]*"; System.out.println("ABC".matches(regex));// false System.out.println("ABC中文".matches(regex));// false System.out.println("中文ABC".matches(regex));// false System.out.println("ABC中文DEF".matches(regex));// false System.out.println("中文".matches(regex));// true
9、正则表达式中还可以使用ASCII编码
// 十六进制表示法,必须为确定的两个数字长 String regex1 = "\\x41"; System.out.println("A".matches(regex1));// true // 八进制表示法 String regex2 = "\\0101"; System.out.println("A".matches(regex2));// true String regex3 = "\\x61"; System.out.println("a".matches(regex3));// true String regex4 = "\\0141"; System.out.println("a".matches(regex4));// true原文链接:https://www.f2er.com/regex/360861.html