https://blog.csdn.net/CSDN___LYY/article/details/53104136
正则表达式
- 匹配的含义
- 一个一个往后找,匹配完一组后进行后续操作后,再找看还有没有匹配的组,如果有继续替换,直到找不到匹配项为止
- 在[]内表示为单一的一个.,不代表任何。
- 元字符" . "
- 代表除n以外的所有中的一个字符,例如:正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
- 元字符" [] "
- 匹配括号中的任何一个字符(集合,字符集合),例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug
- 使用连字符“-”来指定字符的区间来简化表示
- 例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;
- 可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。
- 元字符" | "
- 将两个匹配条件进行逻辑“或”运算。
- 例如:‘z|food’ 能匹配 “z” 或 “food”或者zood(一种类型)(因为这其中包括z)。‘(z|f)ood’ 则匹配 “zood” 或 “food”。其优先级最低。
- 元字符"() "
- 改变优先级,定义提取组。
- 将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体 。
- 元字符" * "
- 匹配 0-多个 在它之前的第一个表达式,和通用符*没有关系。
- 等价于{0,}
- 例如正则表达式“zo*”(等同于z(o)*)能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
- 元字符" "
- 匹配前面的子表达式一次或多次,和*对比(0到多次)。等价于{1,}
- 例如正则表达式9 匹配9、99、999等。 “zo ”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
- 元字符"?"
- 匹配前面的子表达式零次或一次 ,等价于:{0,1}(也可表示可有可无的意思)
- 例如,“do(es)?” 可以匹配 “do” 或 “does” 。【colou?r、favou?r】一般用来匹配“可选部分”。(终止贪婪模式)注意唯一的三元表达式的作用
- 元字符"{} "
- {n} :匹配确定的 n 次。“zo{2}”→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。
- {n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”
- 元字符"^"
- 表示必须以其后面的内容开始才匹配。 匹配一行的开始。
- 例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。 ^abc,匹配一个正则表达式的开始abcjflkdsjfkdsjf。
- 取非,[^0-9]表示不能是0-9内的数字
- 元字符"$"
- 表示正则表达式必须以其前面的内容结尾才匹配,匹配行结束符。
- 例如正则表达式“浮云$” 能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”
- 组成的字符
- d [0-9] 一样的 d数字 d{3}--------234
- D [^0-9] ---非数字 D{3} ------qrw dD ---所有的字符
- s 空白符 ,即一些看不到的符号,空格,回车
- S 非空白符
- sS ---所有的字符
- w 表示的是除了特殊符号以外的任意一个字符 ,数字,字母,下划线。。。
- W 特殊符号 组合Shift键的为特殊符号,加号也是。
- wW ---所有的字符 例如w 帅也可以
- b 代表单词的边界,hoole you一个单词的最后一个字母后面不再是字母,则为边界
- *、 、.、[、-、{2,3}、\d... 加上转义符之后就表示通用符了,没有了其自身的特变含义。
- 对于*. 类的元字符,若想使用其本身,1.\*或@“*”
- 对于d等的来说,则需使用@“\d”才可。
- 对于本身来说,若想用本身,则@“\”或“\\”,因C#和表达式两层才可
其他
- 匹配的意思是若无开头和结尾的要求,那么需要检索的字符串中有一部分并且一群字母之间没有元字符则表示一个整
- ^good$这种类型的只能是good才可以goodgood也不可以,这为完全匹配
- 反向引用(正则表达式内部用组)
- 在正则表达式替换时,通过$1、$2、...来引用分组信息,而在正则表达式中,引用分组信息通过1、2、...这种引用方式就是“反向引用”。“
- 引用分组信息,其实就是将分组匹配到的信息保存起来,供后续使用。
- 输出为一个与输入字符串基本相同的新字符串,唯一的差别在于,其中的每个匹配字符串已被替换字符串代替。
- 代码:一需要该模式的字符串,重叠,就要想到反向引用:
string str = "啊啊啊洋洋洋";
string newStr= Regex.Replace(str, @"(.)1 ", "$1");//可进行配合
- 贪婪模式 和*
- 、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到“再贪婪一点儿”其后的匹配模式就没法匹配为止。
- 在 、*后(紧接着的后面)添加”?“就变成非贪婪模式。(? 的另外一个用途):让其后的匹配模式尽早的匹配。
- 一般开发的时候不用刻意去修饰为非贪婪模式,只有遇到bug的时候发现是贪婪模式的问题再去解决。如果匹配的结果比自己预想的要多,那么一般都是贪婪模式的原因。
实际运用
1. 提取组
正则表达式中用()将要提取的内容括起来,然后就可以通过Match的Groups属性来得到所有的提取元素,注意Groups的序号是从1开始的,0为提取的整体。
代码语言:javascript复制 static void Main(string[] args)
{
string str = "我的邮箱是lyy@itcast.cn和yhb@126.com";
MatchCollection m=Regex.Matches(str, @"([0-9a-zA-Z_.-] )(@[a-zA-Z0-9] (.[a-z] ))");
foreach (Match item in m)//调用Matches方法抽取所有的匹配项
{//var要变为Match
if (item.Success)//运用属性判断是否抽取
{
Console.WriteLine(item.Groups[0].Value "====" item.Groups[1].Value "====" item.Groups[2].Value "===" item.Groups[3].Value) ;
}
}
Console.ReadKey();
}
2. 字符串提取之多行模式
释义:多行模式为你操作的文件或者什么东西的内容为很多行的,用ReadText的时候,系统会将其变为一行,并在每行的间隔的地放添加dr来分隔。所以要对对行操作时,要注意dr字符。
$匹配必须出现在字符串或行的末尾,或出现在字符串或行末尾的 n 之前。$ 定位标记指定前面的模式必须出现在输入字符串的结尾或输入字符串的结尾处的 n 之前。
如果将 $ 与 RegexOptions.Multiline 选项一起使用,则匹配也会出现在一行的末尾。 请注意 $ 匹配 n,但不匹配 rn(回车换行组合,或 CR/LF)。 若要匹配 CR/LF 字符组合,请在正则表达式模式中包含 r?$。
所需的一个属性:Regex.Matches(str, "([A-Za-z] r?)$", RegexOptions.Multiline);
例如:“([A-Za-z] r?)$“该正则表达式为提取每行的最后一个单词。^单个可以提取每行第一个东西。