C#正则表达式的基本语法

前言

正则表达式的匹配模式由一系列数字、文字、运算符、字符等的字符组成,根据自己需求设计对应的模式,实现分析、匹配的操作。本文将对正则表达式组成语法进行讲解。

语法规则

正则表达式构建的匹配模式由转义字符、字符类、定位符、分组构造、限定符、反向引用构造、备用构造、替换、杂项构造等组成。

1、特殊字符:正则表达式中已经具有一定特殊意义的字符

字符描述
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
\将特殊字符变为普通的字符;指定预定义字符集;定义断言
?匹配前面的字符零次或一次
+匹配前面的字符一次或多次
*匹配前面的字符零次或多次
.匹配出换行符外的任意一个字符
-表示字符的匹配范围
|匹配以竖线字符分隔的任何一个字符

示例:

#region ^
// 模式 ^136
  string pattern = @"^136";
  Console.WriteLine(string.Format("字符串是否以136开头:{0}", Regex.IsMatch("1380000001", pattern)));
// 输出
字符串是否以136开头:false
#endregion

#region $
// 模式 $136
  string pattern = @"$136";
  Console.WriteLine(string.Format("字符串是否以136开头:{0}", Regex.IsMatch("13800010136", pattern)));
// 输出
字符串是否以136结束:true
#endregion

#region -
// 模式 ^[A-Za-z]+$
  Regex regex = new Regex(@"^[A-Za-z]+$");
  Console.WriteLine(string.Format("字符串是否全为英文字母:{0}",regex.IsMatch("Hello123")));
// 输出
字符串是否全为英文字母:false
#endregion

2、转义字符:将特殊字符变为普通的字符。下表列举了一些常用的转义字符:

字符描述
\a警报
\b退格
\eEsc
\f换页符
\n换行符
\r回车符
\t水平制表符

示例:


#region \n
// 模式 \n(\w+) 匹配换行符+)");
  string content = "\nHello\nWorld";
  MatchCollection matches = Regex.Matches(content,@"\n(\w+)");
  foreach (Match match in matches)
  {
    Console.WriteLine(string.Format("{0}",match.Value));
  }
// 结果
Hello
World
#endregion

3、定位符:根据字符位置来进行匹配。下表列举一些常用的定位符:

字符描述
\A匹配字符串的开始位置
\Z匹配字符串的结尾位置或结尾换行之前的位置
\z匹配字符串的结尾位置
\G匹配上一个匹配结束的位置
\b匹配字符的开始或结束的位置
\B匹配字符的中间位置

示例:

#region \A
// 模式 \A136
  string pattern = @"\A136";
  Console.WriteLine(string.Format("字符串是否以136开头:{0}", Regex.IsMatch("136SayHello", pattern)));
// 输出
字符串是否以136开头:true
#endregion

#region \B 
// 模式 \Bin\w+
// \B 不在单词边界处开始匹配
// in  匹配子字符串“in”
// \w+ 匹配一个或多个单词字符
  string content = "starting running ending";
  foreach(Match match in Regex.Matches(content, @"\Bin\w+"))
  {
     Console.WriteLine(" {0} 在字符位置 {1}", match.Value, match.Index);
  }
// 输出
ing 在字符位置 5
ing 在字符位置 13
#endregion

4、字符类:定义一组字符,其中的任一字符均可出现在输入字符串中以便成功匹配。

字符描述
[character_group]正字符组指定一个字符列表,任何一个字符可出现在输入字符串中以便进行匹配。
[first-last]正字符组一个字符范围
[^character_group]负字符组指定一个字符列表,任何字符不得出现在输入字符串中以便进行匹配。
[^first-last]负字符组一个字符范围
\w与任何单词字符匹配
\W任何非单词字符
\p{name}name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配
\P{name}与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配
\s与空白字符匹配
\S与任何非空白字符匹配
\d与任何十进制数字匹配
\D匹配不是十进制数的任意字符

示例:

#region [first-last]
// 模式 \b[A-Z]\w*\b
// \b  在单词边界处开始。
// [A-Z]  匹配从 A 到 Z 的所有大写字符。
// \w*  匹配零个或多个单词字符。
// \b  与字边界匹配。
string content = "A work B Hard Zero Time";
foreach (Match match in Regex.Matches(content, @"\b[A-Z]\w*\b"))
{
    Console.WriteLine("{0}", match.Value);
}
// 输出
A
B
Hard
Zero
Time
#endregion

#region \D
// 模式 ^\D\d{1,5}\D*$
// ^  从输入字符串的开头部分开始匹配。
// \D  匹配非数字字符。
// \d{1,5}  匹配一到五个十进制数字。
// \D*  匹配零个、一个或多个非十进制字符。
// $  匹配输入字符串的末尾部分。
  string content = "A1039C";
  Console.WriteLine("{0}", Regex.IsMatch(content, @"^\D\d{1,5}\D*$"));
// 输出
True
#endregion

5、限定符:指定输入中必须存在字符、组或字符类的多少实例才能找到匹配项。

字符描述
{n}恰好匹配 n 次
{n,}至少匹配 n 次
{n,m}匹配 n 到 m 次
*?匹配零次或多次
+?匹配一次或多次
??匹配零次或一次
{n}?前面的元素恰好匹配 n 次
{n,?}前面的元素至少匹配 n 次,但次数尽可能少
{n,m}?匹配上一元素 n 次到 m 次,但次数尽可能少

示例:

#region {n,m}
// 模式 ^\D\d{1,3}\D*$
// ^  从输入字符串的开头部分开始匹配。
// \D  匹配非数字字符。
// \d{1,3}  匹配一到五个十进制数字。
// \D*  匹配零个、一个或多个非十进制字符。
// $  匹配输入字符串的末尾部分。
  string content = "B30590C";
  Console.WriteLine("{0}", Regex.IsMatch(content, @"^\D\d{1,3}\D*$"));
// 输出
False
#endregion

6、分组

字符描述
(subexpression)捕获匹配的子表达式
(?<name>subexpression)捕获匹配的子表达式,并允许你按名称或编号访问它
(?<name1 -name2>subexpression)平衡组定义将删除以前定义的组和存储的定义
(?: subexpression)不会捕获与子表达式匹配的子字符串
(?imnsx-imnsx:subexpression)应用或禁用子表达式中指定的选项
(?= subexpression)定义零宽度正预测先行断言
(?! subexpression)定义零宽度负预测先行断言
(?> subexpression)定义零宽度正回顾后发断言

示例:

#region (?> subexpression)
// 模式 (?<=\b31)\d{2}\b
// (?<=\b31)  以数字位数“31”开头,则继续匹配。
foreach (Match match in Regex.Matches("3124 2024 1140 3119", @"(?<=\b31)\d{2}\b"))
{
    Console.WriteLine(match.Value);
}
// 结果
// 24
// 19
#endregion
#region (subexpression)
// 模式 (?<=\b31)\d{2}\b
// (?<=\b31)  以数字位数“31”开头,则继续匹配。
foreach (Match match in Regex.Matches("3124 2024 1140 3119", @"(?<=\b31)\d{2}\b"))
{
    Console.WriteLine(match.Value);
}
// 结果
// 24
// 19
#endregion

7、替换

字符描述
$number替换按组 number 匹配的子字符串。
${name}包括替换字符串中由 (name) 指定的命名组所匹配的最后一个子字符串。
$$包括替换字符串中的单个“$”文本
$&包括替换字符串中整个匹配项的副本。
$`包括替换字符串中的匹配项前的输入字符串的所有文本。
$'包括替换字符串中的匹配项后的输入字符串的所有文本。
$+包括在替换字符串中捕获的最后一个组。
$_包括替换字符串中的整个输入字符串。

小结

正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎。本文通过一些示例来介绍正则表达式组成模式的常用字符及语法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/758665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【最新鸿蒙应用开发】——用户信息封装

用户管理工具封装 1. 为什么要封装 在进行如下登录功能时&#xff0c; 通常需要将一些用户信息以及token进行持久化保存&#xff0c;以方便下次进行数据请求时携带这些用户信息来进行访问后端数据。下面分享一下鸿蒙当中实用的持久化封装操作。 2. 步骤 封装用户信息管理工具…

Django 配置静态文件

1&#xff0c;DebugTrue 调试模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 创建静态文件 Test/static/6/images/Sni1.png 1.2 添加视图函数 Test/app6/views.py from django.shortcuts impor…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分【第二部分】✔️第三部分&#xff08;精译中 ⏳&#xff09; 1.2.3 Canvas 与 WebGL&#x…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

获取 url 地址栏 ? 后面的查询字符串,并以键值对形式放到对象里面

写在前面 在前端面试当中&#xff0c;关于 url 相关的问题很常见&#xff0c;而对于 url 请求参数的问题也很常见&#xff0c;大部分以笔试题常见&#xff0c;今天就根据这道面试题一起来看一下。 问题 获取 url 地址栏?后面的查询字符串&#xff0c;并以键值对形式放到对象…

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn HadoopHDFSHDFS架构写文件流程读文件流程 MapReduceMapReduce简介MapReduce整体流程 Yarn Hadoop Hadoop是Apache开源的分布式大数据存储与计算框架&#xff0c;由HDFS、MapReduce、Yarn三部分组成。广义上的Hadoop其实是指H…

Ubuntu网络管理命令:netstat

安装Ubuntu桌面系统&#xff08;虚拟机&#xff09;_虚拟机安装ubuntu桌面版-CSDN博客 顾名思义&#xff0c;netstat命令不是用来配置网络的&#xff0c;而是用来查看各种网络信息的&#xff0c;包括网络连接、路由表以及网络接口的各种统计数据等。 netstat命令的基本语法如…

Sora DiT图解【文生视频】

“在古老的迪萨罗斯大陆&#xff0c;曾经住着一位传奇人物&#xff0c;名叫索拉&#xff08;Sora&#xff09;。这个传奇人物体现了无限潜力的本质&#xff0c;包括天空的浩瀚和壮丽。 当它飞得很高&#xff0c;彩虹色的翅膀横跨广阔的空间&#xff0c;光线从它引人注目的身体…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

【算法专题--栈】用栈实现队列 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双栈 模拟 队列 &#x1f95d;栈 和 队列 的特性 &#x1f34d;具体思路 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 用栈实现队列 这道题&#xff0c;可以说是--栈专题--&#xff0c;最经典的一道题&…

Python数据分析-股票分析和可视化(深证指数)

一、内容简介 股市指数作为衡量股市整体表现的重要工具&#xff0c;不仅反映了市场的即时状态&#xff0c;也提供了经济健康状况的关键信号。在全球经济体系中&#xff0c;股市指数被广泛用于预测经济活动&#xff0c;评估投资环境&#xff0c;以及制定财政和货币政策。在中国…

【入门】5分钟了解卷积神经网络CNN是什么

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、卷积神经网络的结构1.1.卷积与池化的作用2.2.全连接层的作用 二、卷积神经网络的运算2.1.卷积层的运算2.2.池化的运算2.3.全连接层运算 三、pytorch实现一个CNN例子3.1.模型的搭建3.2.CNN完整训练代码 CNN神…

几种热管的构造

1、超薄热管构造形式 在实际应用中&#xff0c;超薄热管通常定义为厚度小于2.0mm的平板热管。超薄热管很薄&#xff0c;可紧贴电子元件表面散热&#xff0c;故被广泛应用于移动和可携带电子设备&#xff0c;如智能手机、笔记本电脑和智能手表。用于笔记本电脑和平板电脑的超薄…

【机器学习】Python中sklearn中数据基础处理与分析过程

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 1. 简介 ​编辑 1.1 什么是Scikit-learn 介绍Scikit-learn 应用领域 1.2 安装Scikit-learn 安装步骤 必要的依赖 2. 数据处理 2.1 创建示例数据 2.2 数据预处理 处理缺失值 特征编码 特征缩放 3. 数据…

设计者思维丨权限轴

应用背景 数据的本质是为了业务服务&#xff0c;从而达到更高效的工作方式&#xff0c;实现数据对业务的赋能和推动作用。 因此在构建报表时&#xff0c;需要开发者有设计思维&#xff0c;能够考虑多种应用场景&#xff0c;帮助业务解决实际应用中的问题。 例如&#xff0c;在实…

昇思MindSpore学习入门-函数式自动微分

函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#…

论文解读:【CVPR2024】DUSt3R: Geometric 3D Vision Made Easy

论文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代码&#xff1a;GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一种旨在简化几何3D视觉任务的新框架。作者着重于…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

实验4 图像空间滤波

1. 实验目的 ①掌握图像空间滤波的主要原理与方法&#xff1b; ②掌握图像边缘提取的主要原理和方法&#xff1b; ③了解空间滤波在图像处理和机器学习中的应用。 2. 实验内容 ①调用 Matlab / Python OpenCV中的函数&#xff0c;实现均值滤波、高斯滤波、中值滤波等。 ②调…