简单认识正则表达式的概念
//简单认识正则表达式的概念
public class Test {
public static void main(String[] args) {
// 简单认识正则表达式的概念
// matches:String类里的方法(匹配)
// abc是否符合(匹配)...
// ...代表:一个点代表一个字符
p("abc".matches("..."));
// replaceAll:替代所有的
// 把数字替换成 -
// \\d:代表的为一位数字
p("a8729a".replaceAll("\\d", "-"));
// 要被匹配的模式
// 匹配一个具有三个字符的字符串,而这个三个字符都是来自a-z的字母
Pattern p = Pattern.compile("[a-z]{3}");
// 匹配某一个字符串产生的结果
// Matcher:匹配器
// 用"[a-z]{3}"去匹配 fgh
Matcher m = p.matcher("fgh");
p(m.matches());
// 上面三句话等于下面(建议使用三句话)
p("fgh".matches("[a-z]{3}"));
}
public static void p(Object o) {
System.out.println(o);
}
}
初步认识MetaCharacters(. * + ?)
//初步认识MetaCharacters
//初步认识. * + ?
public class Test1 {
public static void main(String[] args) {
// 简单认识正则表达式的概念
/* p("abc".matches("..."));
p("a8729a".replaceAll("\\d", "-"));
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("fgh");
p(m.matches());
p("fgh".matches("[a-z]{3}"));
*/
// 初步认识. * + ?
// *:代表 0个或多个
// +:代表 1个或多个
// ?:代表 0个或1个
// {3,100}:至少出现3,不超过100次
// \\.代表 . 这个特殊字符
// [ ](中括号代表一个范围)
// [0-2][0-9][0-9]:第一个数字为第一位数字是0到2这个范围,第二个为0到9,第三个为0到9
p("a".matches("."));
p("aa".matches("aa"));
p("aaaa".matches("a*"));
p("aaaa".matches("a+"));
p("".matches("a*"));
p("aaaa".matches("a?"));
// 零宽度匹配
p("".matches("a?"));
p("a".matches("a?"));
p("214523145234532".matches("\\d{3,100}"));
p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
p("192".matches("[0-2][0-9][0-9]"));
}
public static void p(Object o) {
System.out.println(o);
}
}
范围
// 范围
public class Test2 {
public static void main(String[] args) {
// 范围
// [abc]:中括号里面所包含的字符代表的是取abc(中括号里的字符)中的某一个
// 一个中括号[]代表匹配一个字符
p("a".matches("[abc]"));
// ^:代表取除了abc之外的字母
p("a".matches("[^abc]"));
// [a-zA-Z]:取小写的a到z或者大写的A到Z
p("A".matches("[a-zA-Z]"));
// [a-z]|[A-Z]和 [a-zA-Z]等同
p("A".matches("[a-z]|[A-Z]"));
// [a-z[A-Z]] 和 [a-z]|[A-Z]和 [a-zA-Z]等同
p("A".matches("[a-z[A-Z]]"));
// A到Z之中的并且是RFG之一的.
p("R".matches("[A-Z&&[RFG]]"));
}
public static void p(Object o) {
System.out.println(o);
}
}
认识 \s \w \d \
// 认识\s \w \d \
// \d:取0-9
// \D:除了0-9的值
// \s:找出空白字符
// \w:a-z或者A-Z或者包括_(下划线)或者0-9(用户注册时可以用)
public class Test3 {
public static void main(String[] args) {
// "\\s(4)":四个空白字符
p(" \n\r\t".matches("\\s{4}"));
// "\\S":非空白字符
p(" ".matches("\\S"));
// "\\w(3)":构成单词字符
p("a_8".matches("\\w{3}"));
// [a-z]{1,3}:a-z的字母出现1到3次
// \\d+:数字出现1次或者多次
// [&^#%]+:&^#%这四者之一出现1次或多次
p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));
// 在java里必须用\\来代表一个(\)反斜线
// \ + 一个字符 合在一起构成一个转义字符
// matches("\\"):这么写会被正则表达式认为是一个反斜线,在正则表达式里面一个反斜线也是一个特殊字符,
// 它会和后面的字符合在一起,因此双引号又没有匹配的了,所以要在正则表达式匹配一个反斜线写:matches("\\\\")
// matches("\\"):写两个会报错(Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1)
p("\\".matches("\\\\"));
}
public static void p(Object o) {
System.out.println(o);
}
}
Boundary边界处理
// boundary(边界匹配)
// 边界匹配:指的是开头和结尾
// ^如果位于 [] (中括号里)为取反
// ^如果位于外面的话为 一行的起始位置(输入的开头)
$:The end of a line(一行的末尾)
// 边界处理
// 边界匹配:指的是开头和结尾
// *:代表 0个或多个
// +:代表 1个或多个
// ?:代表 0个或1个
public class Test4 {
public static void main(String[] args) {
// POSIX Style
// \\p{Lower}:POSIX Style下的 a-z 表示
p("a".matches("\\p{Lower}"));
// boundary(边界匹配)
// 边界匹配:指的是开头和结尾
// ^如果位于[](中括号里)为取反
// ^如果位于外面的话为 一行的起始位置(输入的开头)
// ^h.*:表示开头的第一个字母为 h . :代表一个字符 *:代表后面跟着0 个或者多个字符
p("hello sir".matches("^h.*"));
// .*ir$:以 ir 结尾前面有0个或者多个字符
p("hello sir".matches(".*ir$"));
// ^h[a-z]{1,3}o\\b.*:以h开头中间是a-z的出现1到3次,后面跟着的是一个o然后跟着一个单词边界(\\b)
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
// \\b:指的是一个单词的边界
// hellosir这里面没有单词边界
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
// whilte lines
// 一篇文章里面有多少个空白行(空格、Tab等等)
// (^[\\s&&[^\\n]])开头的是一个空白字符并且这个空白字符它不是换行符,然后出现0次或多次,最后结束的是换行符(\\n$)
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
// .*\\d{4}. :0个或者多个字符跟着4位数字,4位数字后面有一个字符
p("aaa .8888c".matches(".*\\d{4}."));
// .*\\b\\d{4}. :0个或者多个字符,\\b代表单词边界,在4位数字前面有一个单词边界,4位数字后面有一个字符
p("aaa 8888c".matches(".*\\b\\d{4}."));
p("aaa8888c".matches(".*\\d{4}."));
// aaa8888c 没有单词边界所以 false
p("aaa8888c".matches(".*\\b\\d{4}."));
}
public static void p(Object o) {
System.out.println(o);
}
}