正则积累
基本元字符
^ 在字符组里面表示排除的意思,字符组外面表示行首。用法:^cat匹配所有以cat开头的行,[^0-9]匹配除了0-9之外的任何字符
$ 行末
[..] 匹配a或者b
- 只在[]里面表示特殊意义,其他为普通字符串。用法:[1-8]表示匹配1-8中的任何一个数字
. 在字符组外表示任一字符(除了换行符)。在字符组内表示平常使用的"."
| 在字符组外表示匹配两个子表达式中的一个。这样一种结构叫做“多选结构”。用法:^(ABC|D|E), 匹配以ABC,或者D,或者E,开头的字符串
? 作用于紧接着它的前一个元素,表示前面的这个元素可以出现,也可以不出现。下限0,上限1。例如,au?则?作用于u。如果有()则作用与()里面的内容。例如,
q(au)?中的?作用于au。
+ 至少匹配前面元素一次,下限1,上限不限制。
* 和?+一样,都是量词。下限0,上限不限制。
\ 转义符。你懂的。
提供的简记正则
\t 制表符
\n 换行符
\r 回车符
\s 任何空白字符(空格,制表符等)
\S 除了\s以外的字符(非空字符)
\w 等同于[a-zA-Z0-9]
\W 除了\w以外的字符
\d 等同于[0-9]
\D 除了\d以外的字符
常见组合:
.* 匹配任意多字符。有点像我们平常查询用的*,不过要记住正则里面的*可不是匹配任意字符。
注意点:
贪婪匹配 注意".*"的使用。容易引起回溯
^ 在字符组里面表示排除的意思,字符组外面表示行首。用法:^cat匹配所有以cat开头的行,[^0-9]匹配除了0-9之外的任何字符
$ 行末
[..] 匹配a或者b
- 只在[]里面表示特殊意义,其他为普通字符串。用法:[1-8]表示匹配1-8中的任何一个数字
. 在字符组外表示任一字符(除了换行符)。在字符组内表示平常使用的"."
| 在字符组外表示匹配两个子表达式中的一个。这样一种结构叫做“多选结构”。用法:^(ABC|D|E), 匹配以ABC,或者D,或者E,开头的字符串
? 作用于紧接着它的前一个元素,表示前面的这个元素可以出现,也可以不出现。下限0,上限1。例如,au?则?作用于u。如果有()则作用与()里面的内容。例如,
q(au)?中的?作用于au。
+ 至少匹配前面元素一次,下限1,上限不限制。
* 和?+一样,都是量词。下限0,上限不限制。
\ 转义符。你懂的。
提供的简记正则
\t 制表符
\n 换行符
\r 回车符
\s 任何空白字符(空格,制表符等)
\S 除了\s以外的字符(非空字符)
\w 等同于[a-zA-Z0-9]
\W 除了\w以外的字符
\d 等同于[0-9]
\D 除了\d以外的字符
常见组合:
.* 匹配任意多字符。有点像我们平常查询用的*,不过要记住正则里面的*可不是匹配任意字符。
注意点:
贪婪匹配 注意".*"的使用。容易引起回溯
(?s)
是单行模式RegexOptions.Singleline,意识是.可以匹配回车换行。意思是忽略回车换行,把整个文本当单行一样处理。
(?x)
(?x)
是忽略正则表达式中的空格。比如"(?x)te st"
是可以匹配test的。
(?m)
是 RegexOptions..Multiline,一般称为多行模式,意思是:更改 ^ 和 $
的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。
.*?
表示尽量少的匹配,对于字符串“123456lll4”来说,比如说要匹配1和4之间的数值。如果用“1.*4”那么就会得到结果23456lll,如果用“1.*?4”那么匹配结果为23
分组捕获
通常会需要铺货某两个字符串之间的字符,这是可以用形如(?<id>.*)的方式来分组,然后在用match.Groups["id"].Value;来获得.*表示的值
正则要注意贪婪,勉强与侵占匹配的区别。
例如:
String s = "为45M,为456M";
pattern = Pattern.compile("为(.*)M").matcher(s);
采用"为(.*)M"的时候就是贪婪匹配,程序会将s所有字符全部读入,然后进行匹配,当匹配失败时再从字符串右边减少一个字符然后再次进行匹配。
而勉强匹配则和其相反,是一开始先读入一个字符进行匹配,匹配失败时再读入一个字符进行匹配,他的正则是":为(.*?)M"
侵占匹配和贪婪的行为差不多只不过他不会后退而已。