正则表达式知识点总结

正则表达式知识点总结

 

 * 一、基础知识

 * 1.正则表达式:符合一定规则的表达式。
 * 2.作用:用于专门操作字符串。
 * 3.特点:用一些特定的符号来表示一些代码操作,这样可以简化书写。 所以学习正则表达式,就是在学习一些特殊符号的使用。
 * 4.好处:可以简化对字符串的复杂操作。
 * 5.弊端:符号定义越多,正则越长,阅读性越差。


 * 二、常用操作功能

 * 1.匹配:boolean matches(String regex) 
 *    用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false

 * 2.切割:String[] split(String regex) 
 *    根据给定的正则表达式的匹配拆分此字符串
 * 典型demo:
 *(1)splitDemo("zs  ls   ww"," +");//按照多个空格来进行切割
 *(2)splitDemo("zs.ls.ww","\\.");//按照 . 来进行切割
 *(3)splitDemo("D:\\abc\\de","\\\\");//按照\\来进行切割
 *(4)splitDemo("abcddefgkkkhi","(.)\\1+");//按照叠词完成切割
 
 * 3.替换:String replaceAll(String regex, String replacement) 
 *    使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
 * 典型demo:
 *(1)replaceAllDemo(str,"\\d{5,}","#");//将字符串中的连续超过5个的数字替换成#
 *(2)replaceAllDemo(str2,"(.)\\1+","*");//将叠词替换成*    
 *(3)replaceAllDemo(str3,"(.)\\1+","$1");//将重叠的字符替换成单个字母,如:ddd变成d        

 * 4.获取:将字符串中符合规则的子串取出
 * 操作步骤
 *(1)将正则表达式封装成对象;
 *(2)让正则对象和要操作的字符串相关联;
 *(3)关联后,获取正则匹配引擎;
 *(4)通过引擎对符合规则的子串进行操作,比如:取出
 * 典型demo:            
 * String str = "ming tian fang jia lea";
 * String reg = "\\b[a-z]{3}\\b";//"\b"表示单词边界
 * Pattern p = Pattern.compile(reg);//将规则封装成对象
 * Matcher m = p.matcher(str);//让正则对象和要作用的字符串相关联,获取匹配器对象
 * //类似于迭代器
 * while(m.find()){//将规则作用到字符串上,并进行符合规则的子串查找
 *    System.out.println(m.group());//用于获取匹配后结果
 *    System.out.println(m.start()+"..."+m.end());//匹配后结果起始和结束位置
 * }    

 * 5.四种功能选用方式
 * 思路:
 *(1)如果只想知道该字符是对是错,使用匹配;
 *(2)想要将已有的字符串变成另一个字符串,使用替换;
 *(3)想要按照自定的方式将一个字符串变成多个字符串,使用切割;(获取规则以外的子串)
 *(4)想要拿到符合需求的字符串子串,使用获取。(获取符合规则的子串)


 * 三、常见应用情形

 * 1.匹配的应用
 *(1)应用一:对qq号码进行校验   regex="[1-9]\\d{4,14}";
 *(2)应用二:对手机号段进行校验 regex="1[358]\\d{9}";
 *(3)应用三:对邮件地址进行校验 
 * regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-z]+){1,3}";//较为精确的匹配
 * regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配
 
 * 2.替换的应用
 * 将ip地址进行地址段顺序的排序【必须掌握】    
 * 例如:192.68.1.254  102.49.23.013  10.10.10.10  2.2.2.2 
 * 思路:
 * 按照字符串自然顺序,只要让它们每一段都是3位即可。
 *(1)按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有三位;
 *(2)将每一段只保留三位,这样,所有的ip地址都是每一段三位。     
     
 * 3.获取的应用
 *   获取指定文档中的邮件地址(网页爬虫)


 * 四、常用特殊符号(API中)

 * 1.字符类 
 * [abc]                 a、b 或 c(简单类) 
 * [^abc]               任何字符,除了a、b 或 c(否定) 
 * [a-zA-Z]            a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
 * [a-d[m-p]]         a 到 d 或 m 到 p:[a-dm-p](并集) 
 * [a-z&&[def]]      d、e 或 f(交集) 
 * [a-z&&[^bc]]     a 到 z,除了 b 和 c:[ad-z](减去) 
 * [a-z&&[^m-p]]   a 到 z,而非 m 到 p:[a-lq-z](减去) 
 
 * 2.预定义字符类 
 * . 任何字符(与行结束符可能匹配也可能不匹配) 
 * \d 数字                [0-9] 
 * \D 非数字            [^0-9] 
 * \s 空白字符         [ \t\n\x0B\f\r] 
 * \S 非空白字符     [^\s] 
 * \w 单词字符        [a-zA-Z_0-9] 
 * \W 非单词字符   [^\w] 
 
 * 3.Greedy 数量词 
 * X? X,          零次或一次
 * X* X,          零次或多次 
 * X+ X,          一次或多次 
 * X{n} X,       恰好 n 次 
 * X{n,} X,      至少 n 次 
 * X{n,m} X,   至少 n 次,但是不超过 m 次 

 

 


 

<think>我们被要求提供C#中正则表达式的相关知识点。根据引用[1]和[2],我们知道有两个进阶章节:理论篇和实践篇。理论篇主要涉及正则表达式的基本语法和构造,而实践篇则涉及C#中Regex类的具体使用方法。另外,引用[3]提到正则表达式在shell中的分类和应用,但我们的重点是C#。 因此,我们可以将C#正则表达式知识点分为两个部分:理论部分(正则表达式语法)和C#实践部分(使用Regex类的方法和属性)。 ### 理论部分(正则表达式语法): 1. **字符转义**:在正则表达式中,某些字符具有特殊含义(如`.`、`*`、`?`、`+`等),如果要匹配这些字符本身,需要使用转义字符`\`。例如,匹配点号需要使用`\.`。 2. **字符类**:用于匹配一组字符中的任意一个。 - `[abc]`:匹配a、b或c。 - `[^abc]`:匹配除a、b、c以外的任意字符。 - `[a-z]`:匹配任意小写字母。 - `.`:匹配除换行符以外的任意字符(在单行模式下可以匹配换行符)。 3. **定位点(锚点)**:用于指定匹配发生的位置。 - `^`:匹配字符串的开始(在多行模式下匹配行的开始)。 - `$`:匹配字符串的结束(在多行模式下匹配行的结束)。 - `\b`:匹配单词边界。 - `\B`:匹配非单词边界。 4. **分组构造**:用于将多个字符组合成一个子表达式,以便对其应用量词或其他操作。 - `(expression)`:捕获分组,将子表达式匹配到的内容保存到自动命名的组中。 - `(?<name>expression)`:命名捕获分组,将匹配到的内容保存到指定名称的组中。 - `(?:expression)`:非捕获分组,不保存匹配内容。 5. **数量词(限定符)**:指定匹配的次数。 - `*`:匹配前面的元素零次或多次。 - `+`:匹配一次或多次。 - `?`:匹配零次或一次。 - `{n}`:匹配恰好n次。 - `{n,}`:匹配至少n次。 - `{n,m}`:匹配至少n次,但不超过m次。 6. **反向引用构造**:用于引用之前捕获的组。 - `\1`:引用第一个捕获组(按顺序)。 - `\k<name>`:引用命名捕获组。 7. **替换构造**:类似于条件匹配。 - `|`:用于在两个模式之间选择,匹配其中一个。例如,`a|b`匹配a或b。 ### C#实践部分(使用Regex类): 在C#中,正则表达式功能主要通过`System.Text.RegularExpressions`命名空间下的`Regex`类提供。以下是常用方法和属性: 1. **Regex.IsMatch方法**:用于判断输入字符串中是否包含与正则表达式模式匹配的子串。 ```csharp bool isMatch = Regex.IsMatch(input, pattern); ``` 2. **Regex.Match方法**:在输入字符串中搜索匹配正则表达式模式的第一个子串,返回一个`Match`对象。 ```csharp Match match = Regex.Match(input, pattern); if (match.Success) { string value = match.Value; // 获取捕获的值 } ``` 3. **Regex.Matches方法**:在输入字符串中搜索所有匹配的子串,返回一个`MatchCollection`集合。 ```csharp MatchCollection matches = Regex.Matches(input, pattern); foreach (Match m in matches) { // 处理每个匹配 } ``` 4. **Regex.Replace方法**:在输入字符串中,将匹配正则表达式模式的所有子串替换为指定的字符串。 ```csharp string result = Regex.Replace(input, pattern, replacement); ``` 5. **Match.NextMatch方法**:当需要从上一个匹配结束的位置开始继续搜索时使用。 ```csharp Match match = Regex.Match(input, pattern); while (match.Success) { // 处理匹配 match = match.NextMatch(); } ``` 6. **正则表达式选项**:可以通过`RegexOptions`枚举来设置正则表达式的匹配选项,例如: - `IgnoreCase`:忽略大小写。 - `Multiline`:多行模式,改变`^`和`$`的含义,使它们分别匹配行的开始和结束。 - `Singleline`:单行模式,使`.`匹配包括换行符在内的所有字符。 - `IgnorePatternWhitespace`:忽略模式中的空白(包括空格和注释)。 ### 常用案例: 1. **验证邮箱格式**: ```csharp string emailPattern = @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"; bool isValidEmail = Regex.IsMatch(email, emailPattern); ``` 2. **提取URL中的域名**: ```csharp string url = "https://www.example.com/path"; string domainPattern = @"^(?:https?:\/\/)?([^\/\s]+)"; Match match = Regex.Match(url, domainPattern); if (match.Success) { string domain = match.Groups[1].Value; } ``` 3. **替换敏感词**: ```csharp string input = "这是一些敏感词,比如色情、暴力等。"; string sensitivePattern = "色情|暴力"; string result = Regex.Replace(input, sensitivePattern, "***"); ``` 4. **分割字符串**(使用`Regex.Split`): ```csharp string input = "123abc456def789"; string pattern = "[a-z]+"; string[] result = Regex.Split(input, pattern); // 结果为:["123", "456", "789"] ``` 以上是C#正则表达式的主要知识点和常见用法。这些内容涵盖了理论知识和实际编程中的使用方法。 §§相关问题§§ 1. 在C#中,如何编写一个正则表达式来匹配IP地址? 2. 如何使用命名捕获组在C#正则表达式中,并举例说明? 3. 在C#中使用正则表达式时,如何提高匹配效率(性能优化)? 4. 正则表达式中的贪婪模式和懒惰模式有什么区别?如何在C#中指定? </think>### C#正则表达式知识点总结 #### 一、核心语法(理论篇) 1. **字符转义** 特殊字符需转义:`\.`、`\*`、`\?` 等,例如匹配点号需 `\.`。 2. **字符类** - `[aeiou]` 匹配元音字母 - `[^0-9]` 匹配非数字字符 - `\d` 等价于 `[0-9]`(数字) - `\w` 匹配字母/数字/下划线(单词字符) 3. **定位点** - `^` 匹配字符串起始 - `$` 匹配字符串结尾 - `\b` 匹配单词边界(如 `\bword\b`) 4. **分组构造** - `(exp)` 捕获分组(可通过索引访问) - `(?<name>exp)` 命名捕获组(如 `(?<year>\d{4})`) - `(?:exp)` 非捕获组(不存储匹配) 5. **数量词** - `*`(0次或多次) - `+`(1次或多次) - `{n,m}`(n到m次,如 `\d{3,5}`) #### 二、C#实践方法 1. **基础验证** ```csharp bool isValid = Regex.IsMatch("text123", @"\w+\d{3}"); // 检查格式 ``` 2. **提取匹配结果** ```csharp Match match = Regex.Match("2023-08-15", @"(?<year>\d{4})-(?<month>\d{2})"); if (match.Success) string year = match.Groups["year"].Value; // 获取命名组 ``` 3. **连续匹配** ```csharp MatchCollection matches = Regex.Matches("a1 b2 c3", @"\w\d"); foreach (Match m in matches) { Console.WriteLine(m.Value); // 输出 a1, b2, c3 } ``` 4. **替换文本** ```csharp string result = Regex.Replace("Hello World", "World", "C#"); // 输出 "Hello C#" ``` #### 三、高级特性 1. **正则选项** - `RegexOptions.IgnoreCase`:忽略大小写 - `RegexOptions.Multiline`:多行模式(使 `^/$` 匹配行首行尾) ```csharp Regex.Match("Text", "TEXT", RegexOptions.IgnoreCase); ``` 2. **反向引用** 在替换中引用捕获组: ```csharp Regex.Replace("AB-CD", @"(\w+)-(\w+)", "$2-$1"); // 输出 "CD-AB" ``` 3. **懒惰模式** 默认贪婪匹配(`.*` 匹配到最长),添加 `?` 转为懒惰模式: `.*?`(匹配到最短符合条件的字符串) #### 四、应用场景 1. **表单验证**:邮箱、电话、身份证号格式校验 2. **日志分析**:提取特定模式的日志信息 3. **文本清洗**:移除HTML标签或敏感词 4. **数据转换**:日期格式重排(如 `YYYYMMDD` → `DD/MM/YYYY`) > 参考来源: > [^1]: C#正则表达式实践篇(Regex.IsMatch/Match/Replace等方法详解) > [^2]: C#正则表达式理论篇(语法结构总结)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值