正则积累

基本元字符 
^ 在字符组里面表示排除的意思,字符组外面表示行首。用法:^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)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"
侵占匹配和贪婪的行为差不多只不过他不会后退而已。
原文地址:https://www.cnblogs.com/qianlifeng/p/2122015.html