用AAA去匹配AAABBBCCC,AAA:匹配字符串,AAABBBCCC:被匹配字符串
Pattern pattern = Pattern.compile(sub);
Matcher matcher = pattern.matcher(html);
while(matcher.find())
System.out.println(matcher.group());
--------------------------------------------------------------------
() 表示一个捕获组:(?<xxx>) => matcher.group("xxx");
或表示小括号内连续字符可以作为多选进行匹配:精确匹配AB或BC => (AB|BC)
[] 用于组合不同字符类型
{} 用于表示范围:{x,y} => x≤?≤y;{x,} => x≤?;
--------------------------------------------------------------------
. .=[\w\W]代表除\r\n以外的任何单个字符
\w 单词字符[a-zA-Z_0-9]
\W 非单词字符[^\W]
\s 一个空格
--------------------------------------------------------------------
^ 表示匹配一行的开头:被匹配字符串必须以^之后的东西开头才能匹配到
e.g:匹配“aa123;”=> "^\w+"
$ 表示匹配一行的结尾:被匹配字符串必须以$之前的东西结尾才能匹配到
e.g:匹配“123;”=> ".+;$"
+ 表示匹配一个或多个(匹配多个)
? 表示匹配0个或1个(有或无)
* 表示匹配0个或多个
()? 表示小括号内的部分参与分组且可有可无
(?:xxx) 表示小括号内的部分不参与捕获组的分组
(?:xxx)? 表示xxx不参与分组且xxx是可有可无的
--------------------------------------------------------------------
小写字母匹配: [a-z]=[abcdefghizjlmnopqrstuvwxyz]
不在小写字母范围内匹配: [^a-z]
大写字母匹配: [A-Z]=[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
不在大写字母范围内匹配: [^A-Z]
忽视大小写: (?i)\w
Pattern.compile(sub,Pattern.CASE_INSENSITIVE);
中文匹配: [/u4e00-/u9fa5] 来自unicode表
[\\x{4e00}-\\x{9fa5}] 来自16进制
--------------------------------------------------------------------
如果在写正则表达式的时候用小括号括住某一部分,那么这一部分在程序读取时会被自动地认为是一个捕获组,这时如果用matcher.group(i)来取的话就可以单独地取出小括号内的这部分。
e.g: sub="@(.+)",html="@123"
matcher.group(); => "[@123]"
matcher.group(1); => "123"
像上述方法还有另一种写法,即给这个分组定义一个索引值key:(但java6及之前的版本没有group(String str)的方法,从7开始之后才有)
sub="@(?<key>.+)"
matcher.group("key"); => "123"
如果想要表示截取AB或BC这样单个或连续字符串就可以使用(AB|BC)这样来表示,如果使用
[AB|BC]会导致匹配出A/B/C这三个字符排列组合的所有结果
Pattern pattern = Pattern.compile(sub);
Matcher matcher = pattern.matcher(html);
while(matcher.find())
System.out.println(matcher.group());
--------------------------------------------------------------------
() 表示一个捕获组:(?<xxx>) => matcher.group("xxx");
或表示小括号内连续字符可以作为多选进行匹配:精确匹配AB或BC => (AB|BC)
[] 用于组合不同字符类型
{} 用于表示范围:{x,y} => x≤?≤y;{x,} => x≤?;
--------------------------------------------------------------------
. .=[\w\W]代表除\r\n以外的任何单个字符
\w 单词字符[a-zA-Z_0-9]
\W 非单词字符[^\W]
\s 一个空格
--------------------------------------------------------------------
^ 表示匹配一行的开头:被匹配字符串必须以^之后的东西开头才能匹配到
e.g:匹配“aa123;”=> "^\w+"
$ 表示匹配一行的结尾:被匹配字符串必须以$之前的东西结尾才能匹配到
e.g:匹配“123;”=> ".+;$"
+ 表示匹配一个或多个(匹配多个)
? 表示匹配0个或1个(有或无)
* 表示匹配0个或多个
()? 表示小括号内的部分参与分组且可有可无
(?:xxx) 表示小括号内的部分不参与捕获组的分组
(?:xxx)? 表示xxx不参与分组且xxx是可有可无的
--------------------------------------------------------------------
小写字母匹配: [a-z]=[abcdefghizjlmnopqrstuvwxyz]
不在小写字母范围内匹配: [^a-z]
大写字母匹配: [A-Z]=[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
不在大写字母范围内匹配: [^A-Z]
忽视大小写: (?i)\w
Pattern.compile(sub,Pattern.CASE_INSENSITIVE);
中文匹配: [/u4e00-/u9fa5] 来自unicode表
[\\x{4e00}-\\x{9fa5}] 来自16进制
--------------------------------------------------------------------
如果在写正则表达式的时候用小括号括住某一部分,那么这一部分在程序读取时会被自动地认为是一个捕获组,这时如果用matcher.group(i)来取的话就可以单独地取出小括号内的这部分。
e.g: sub="@(.+)",html="@123"
matcher.group(); => "[@123]"
matcher.group(1); => "123"
像上述方法还有另一种写法,即给这个分组定义一个索引值key:(但java6及之前的版本没有group(String str)的方法,从7开始之后才有)
sub="@(?<key>.+)"
matcher.group("key"); => "123"
如果想要表示截取AB或BC这样单个或连续字符串就可以使用(AB|BC)这样来表示,如果使用
[AB|BC]会导致匹配出A/B/C这三个字符排列组合的所有结果
常用“.+”来表示贪婪选取所有字符,用“.+?”来表示非贪婪选取所有字符,即只要符合某一标准即作为一个捕获组。
元字符 语法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
& 匹配字符串的结束
\w 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符