前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#基础知识之字符串和正则表达式的案例分享

C#基础知识之字符串和正则表达式的案例分享

原创
作者头像
用户7718188
发布于 2022-11-06 12:23:24
发布于 2022-11-06 12:23:24
9830
举报
文章被收录于专栏:高级工程司高级工程司

String

System.String类专门用于存储字符串,允许对字符串进行许多操作。此外,由于这种数据类型非常重要,C# 提供了它自己的关键字和相关的语法,以便使用这个类来轻松地处理字符串。使用运算符重载可以连接字符串:

123

string messagel = ''Hello"; // returns "Hello" messagel += ”,There";   // returns "Hello, There"string message2 = messagel + "!";  // returns "Hello, There! "

c#还允许使用类似于索引器的语法来提取指定的字符:

12

string message = ''Hello”;char char4 = message[4]; // returns "0"

这个类可以完成许多常见的任务,如替换字符、删除空白和把字母变成大写形式等。

string 和 stringbuilder

String类是一个功能非常强大的类,它实现许多很有用的方法。但是,String类存在一个问题: 重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,这意味着一旦对字符串对象进行了 初始化,该字符串对象就不能改变了。

12

string greetingText = "Hello from all the people at Wrox Press.greetingText += **We do hope you enjoy this book as much as we enjoyed writing it.";

在执行这段代码时,首先创建一个System.String类型的对象,并把它初始化为文本“Hello from all lhepeople at Wrox Press. ”,注意句号后面有一个空格。此时.NET运行库会为该字符串分配足够的内存来保存这个文本(41 个字符),再设置变量greetingText来表示这个字符串实例。

从语法上看,下一行代码是把更多的文本添加到字符串中。实际上并非如此,在此是创建一个新字符串实 例,给它分配足够的内存,以存储合并的文本(共104个字符)。把最初的文本“Hello from all the people at Wrox Press. ” 复制到这个新字符串中,再加上额外的文本 “We do hope you enjoy this book as much as we enjoyed writing it.”。然后更新存储在变量greetingText中的地址,使变量正确地指向新的字符串对象。现在没有引用旧的字符串 对象一不再有变量引用它,下一次垃圾收集器清理应用程序中所有未使用的对象时,就会删除它。

StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。

1

var sb = new StringBuilder("Hello");

String是不可变类,StringBuilder是可变类。

字符串格式

$前缀

12

string si = "World"; string s2 = $"Hello, {s1}“;

在现实中,这只是语法糖。对于带$前缀的字符串,编译器创建String.Format方法的调用。所以前面的代码段解读为:

12

string si = "World";string s2 = String.Format("Hello, {0}", si);

StringFormat

StringTormat方法的第一个参数接受一个格式字符串,其中的占位符从0开始编号,其后是放入字符串空白处的参数。新的字符串格式要方便得多,不需要编写那么多代码。

不仅可以使用变量来填写字符串的空白处,还可以使用返回一个值的任何方法:

1

string s2 = $”Hello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->si. ToUpper() } '*;

这段代码可解读为如下类似的语句:

1

string s2 = String.Format(nHello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->0}”,si.ToUpper ());

字符串还可以有多个空白处,如下所示的代码:

12

int x = 3, y = 4;string s3 = $"MThe result of {x} + {y}  is {x + y}'";

解读为:

1

string s3 = String.Format("The result of {0} and {1} is {2 } ", x, y, x + y);

转义花括号

如果希望在插值字符串中包括花括号,可以使用两个花括号转义它们:

12

string s = "Hello";Console.WriteLine($"{{s}}  displays the value of s:   {s}");

WriteLine方法被解读为如下实现代码:

1

Console.WriteLine (String.Format (*'{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->s} displays the value of s: {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->0}", s));

输出如下:

{s}   displays the value of s :    Hello

还可以转义花括号,从格式字符串中建立一个新的格式字符串。下面看看这个代码段:

123

string formatstring = $" {s},   {{0 } } "; string s2 = "World";WriteLine(formatstring, s2);

有了字符串变量formatstring,编译器会把占位符0插入变量s,调用String.Format:

1

string formatstring = String. Format ("{0}, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->{0} } ", s);

这会生成格式字符串,其中变量s替换为值Hello,删除第二个格式最外层的花括号:

1

string formatstring = "Hello, {0}";

在WriteLine方法的最后一行,使用变量s2的值把World字符串插值到新的占位符0中:

1

WriteLine("Hello, World");

日期时间和数字的格式

除了给占位符使用字符串格式之外,还可以根据数据类型使用特定的格式。下面先从日期开始。在占位符 中,格式字符串跟在表达式的后面,用冒号隔开。下面所示的例子是用于DateTime类型的D和d格式:

123

var day = new DateTime(2025, 2, 14); WriteLine ($"{day:D}");WriteLine ($"{day:d}”);

结果显示,用大写字母D表示长日期格式字符串,用小写字母d表示短日期字符串:

12

Friday, February 14, 2025 2/14/2025

应该提到的一个问题是,为DateTime构建自定义的格式字符串。自定义的日期和时间格式字符串可以结合 格式说明符,例如dd-MMM-yyyy:

1

Console.WriteLine($"{day:dd-MMM-yyyy}");

结果如下:

14-Feb-2025

这个自定义格式字符串利用dd把日期显示为两个数字(如果某个日期在10日之前,这就很重要,从这里可以看到d和dd之间的区别)、MMM(月份的缩写名称,注意它是大写,而mm表示分钟)和表示四位数年份的yyyy。

数字的格式字符串不区分大小写。下面看看n、e、x和c标准数字格式字符串:

12

int i = 2477;Console.WriteLine($"{i:n} {i:e} {i:x} {i:c}H);

n格式字符串定义了一个数字格式,用组分隔符显示整数和小数。e表示使用指数表示法,x表示转换为十六进制,c显示货币:

2,477.00 2.477000e+003 9ad $2,477.00

对于数字的表示,还可以使用定制的格式字符串。#格式说明符是一个数字占位符,如果数字可用,就显示 数字;如果数字不可用,就不显示数字。0格式说明符是一个零占位符,显示相应的数字,如果数字不存在

正则表达式

正则表达式语言是一种专门用于字符串处理的语言。它包含两个功能:

  • 一组用于标识特殊字符类型的转义代码。你可能很熟悉DOS命令中使用字符表示任意子字符串(例如, DOS命令DirRe会列出名称以Re开头的所有文件)。正则表达式使用与*类似的许多序列来表示“任 意一个字符”、“一个单词的中断”和个可选的字符”等。一个系统,在搜索操作中把子字符串和中1:司结果的各个部分组合起来。
  • 识别(可以是标记或删除)字符串中所有重复的单词,例如,把“The computer books books”转换为“The computer books"

1

const string text =            "Professional C# 6 and .NET Core 1.0 provides complete coverage " +            "of the latest updates, features, and capabilities, giving you " +            "everything you need for C#. Get expert instruction on the latest " +            "changes to Visual Studio 2015, Windows Runtime, ADO.NET, ASP.NET, " +            "Windows Store Apps, Windows Workflow Foundation, and more, with " +            "clear explanations, no-nonsense pacing, and valuable expert insight. " +            "This incredibly useful guide serves as both tutorial and desk " +            "reference, providing a professional-level review of C# architecture " +            "and its application in a number of areas. You'll gain a solid " +            "background in managed code and .NET constructs within the context of " +            "the 2015 release, so you can get acclimated quickly and get back to work.";Console.WriteLine("Find1\n");const string pattern = "ion"; MatchCollection matches = Regex.Matches(text, pattern,                                        RegexOptions.IgnoreCase |                                        RegexOptions.ExplicitCapture);WriteMatches(text, matches);Console.WriteLine();

在这段代码中,使用了 System.Text.RegularExpressions名称空间中Regex类的静态方法Matches()0这个方 法的参数是一些输入文本、一个模式和从RegexOptions枚举中提取的一组可选标志.

表描述了 RegexOptions枚举的一些成员。

正则匹配主要符号规则如下:

在默认情况下,把模式的一部分组合为一个组时,就要求正则表达式引擎按照该组来匹配,或按照整个模式来匹配。换言之,可以把组当成一个要匹配和返回的模式。如果要把字符 串分解为各个部分,这种模式就非常有效。

2

public static void NamedGroups(){     Console.WriteLine("NamedGroups\n");     string line = "Hey, I've just found this amazing URI at http:// what was it --oh yes https://www.wrox.com or http://www.wrox.com:80";      string pattern = @"\b(?<protocol>https?)(?:://)(?<address>[.\w]+)([\s:](?<port>[\d]{2,4})?)\b";     Regex r = new Regex(pattern, RegexOptions.ExplicitCapture);      MatchCollection mc = r.Matches(line);     foreach (Match m in mc)     {         Console.WriteLine($"match: {m} at {m.Index}");          foreach (var groupName in r.GetGroupNames())         {             Console.WriteLine($"match for {groupName}: {m.Groups[groupName].Value}");         }         Console.WriteLine();     }     Console.WriteLine();}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
因果图模型:理解因果关系的强大工具
在科学研究中,理解变量之间的因果关系至关重要。因果关系帮助我们不仅了解事物之间的关联,还能解释为什么这些关系存在。例如,医生想知道某种药物是否能有效治疗疾病,政策制定者想知道新的教育政策是否能提高学生成绩。因果图模型(Causal Graph Model)为我们提供了一种系统的方法来表示和推理这些因果关系。本文将详细介绍因果图模型的基本概念、组成部分、建立方法、因果推理和实际应用,帮助读者理解和使用这一强大工具。
theskylife
2024/07/31
1.1K0
数据并非都是正态分布:三种常见的统计分布及其应用
你有没有过这样的经历?使用一款减肥app,通过它的图表来监控自己的体重变化,并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重,这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个模型将我所有过去的体重数据进行平均处理,然后绘制一条直线预测未来的体重变化。然而,体重减轻通常不会呈线性发展,使用更复杂的数学模型,如泊松回归,可能会更加贴近真实情况。
deephub
2024/06/17
5280
数据并非都是正态分布:三种常见的统计分布及其应用
动态 | 谷歌大脑医疗影像研究新进展,通过视网膜影像预测心脑血管疾病风险
AI 科技评论按:Google Brain 团队近日发现一种使用机器学习来评估心脑血管疾病风险的新方法。这种方法通过分析病人的眼睛影像,能够精确地推断出包括病人年龄、血压、是否吸烟等的相关因素,通过这些因素可以预测病人遭受重大心脑血管疾病的风险——比如心脏病发作。 这种方法与当前最先进的方法相比具有大致相同的准确度,而其优点在于,可以为医生提供快速、便捷的方法来分析病人的心脑血管疾病,并且不需要血液测试。可能更为重要的是,这项工作代表了科学发现的一种新方法。 相关的工作(Prediction of card
AI科技评论
2018/03/06
1K0
动态 | 谷歌大脑医疗影像研究新进展,通过视网膜影像预测心脑血管疾病风险
业界 | 通过分析视网膜图像诊断心脑血管疾病:谷歌大脑团队取得医疗深度学习新进展
选自Google Blog 作者:Lily Peng 机器之心编译 参与:许迪、黄小天 近日,Jeff Dean 在其推特上说:「谷歌大脑团队在机器学习+医疗上再次取得新进展;我们有了令人鼓舞的新发现:非侵入式视网膜图像上含有机器学习模型可以介入的确诊心脑血管疾病的微妙指标,之前医生都不知道有这种迹象。」 心脏病、中风和其他心脑血管疾病一直是人类健康的头号杀手。评估这类风险是未来降低患者罹患心脑血管疾病的关键性第一步。为此,医生要考虑多种风险因子—比如遗传(性别或年龄)、生活习惯(抽不抽烟,血压等)。大部分
机器之心
2018/05/10
8500
揭开因果图模型的神秘面纱:常用的因果图模型
因果图模型(Causal Diagram Models)是一种通过图形化方法表示变量之间因果关系的工具。它在统计学、社会科学、流行病学等研究领域中广泛应用。因果推断(Causal Inference)则是利用这些图模型来确定变量之间的因果关系,而不仅仅是关联关系。本文将介绍几种常见的因果图模型,探讨它们的使用范围、如何使用及其应用场景,并通过图形实例进行说明。
theskylife
2024/08/01
2K0
NLPer,是时候重视因果推理了!这有一份杨笛一等撰写的综述
机器之心报道 编辑:张倩 在这篇综述论文中,来自佐治亚理工学院的杨笛一等十几位研究者系统阐述了自然语言处理中的因果推理。 科学研究的一个基本目标是了解因果关系。然而,尽管因果在生活和社会科学中扮演了重要角色,它在 NLP 中却没有得到同样重要的地位,后者通常更加重视预测任务。随着因果推理和语言处理交叉研究领域的出现,二者之前的界限正变得模糊,但 NLP 中的因果推理研究仍然分散在各个领域,没有统一的定义、基准数据集和对剩余挑战的清晰表述。 在这篇综述论文中,来自以色列理工学院的 Amir Feder、佐治亚
机器之心
2023/03/29
2690
NLPer,是时候重视因果推理了!这有一份杨笛一等撰写的综述
【谷歌AI以眼识心】超越人类医生,从视网膜图像识别心脏病
新智元报道 来源:Google blog、DeepMind 编辑:闻菲、常佩琦、艾霄葆 【新智元导读】谷歌大脑研究人员刚刚在官博上宣布了他们的最新研究成果,使用深度学习分析视网膜图像,以此预测心血管疾病突发的风险。使用深度学习来获得人体解剖学和疾病变化之间的联系,这是人类医生此前完全不知道的诊断和预测方法,不仅能帮助科学家生成更有针对性的假设,还可能代表了科学发现的新方向。 谷歌AI发现了人类医生尚未发现的诊断方法:用深度学习找到视网膜图像与心血管疾病联系 心脏病发作、中风和其他心血管疾病仍是最重要
新智元
2018/03/20
1.4K0
【谷歌AI以眼识心】超越人类医生,从视网膜图像识别心脏病
【聚焦】从李亚鹏谢顶说起, 用大数据谈失败婚姻对人的打击
编者按 王菲的前夫李亚鹏日前被人发现“后脑勺头发稀疏”,有网友点名王菲男友谢霆锋要小心,因为“有一种王菲的前男人叫秃头”,前夫窦唯和李亚鹏都中奖了。 但你们先别急着嘲笑李亚鹏,让大数据告诉你婚姻失败对人打击有多大!稳定的婚姻,对于社会来说无疑是个好事,对于人的身体健康呢? 来源:他们说 早在1858年,法国的流行病学家威廉·法尔就研究过婚姻对健康的影响。他将成年人群分为“已婚”、“单身”和“丧偶”三类。结合死亡率、年龄及其他因素分析后,他发现,单身人群的疾病死亡率是比已婚者高出许多的,而丧偶
小莹莹
2018/04/23
7130
【聚焦】从李亚鹏谢顶说起, 用大数据谈失败婚姻对人的打击
R语言探索BRFSS数据可视化
在本实验中,我们将使用dplyr软件包探索数据,并使用ggplot2软件包对其进行可视化以进行数据可视化
拓端
2020/08/23
7970
新冠病毒侵入人体全过程!从脚趾到大脑,科学家追踪到病毒对身体的巨大摧残
在杜兰大学医学院,肺病和重症监护医生Joshua Denson发现,一天之内,在约20位重症监护病人中,有2名患者出现癫痫症状,其余不少患者出现呼吸衰竭的症状,还有小部分患者的肾脏功能急剧衰减。
大数据文摘
2020/05/19
7250
新冠病毒侵入人体全过程!从脚趾到大脑,科学家追踪到病毒对身体的巨大摧残
知识图谱嵌入与因果推理的结合
知识图谱通过节点(实体)和边(关系)来表示现实世界中的信息,但如何将这些信息转化为可进行推理和决策的形式,仍然是一个挑战。
数字扫地僧
2024/09/22
7680
知识图谱嵌入与因果推理的结合
贝叶斯网络之父Judea Pearl:新因果科学与数据科学、人工智能的思考
本文介绍贝叶斯网络之父 Judea Pearl 《新因果科学与数据科学、人工智能的思考》的报告。
数据派THU
2020/06/28
3640
贝叶斯网络之父Judea Pearl:新因果科学与数据科学、人工智能的思考
中国医疗大数据发布!怎样推翻你身上的“三座大山”?
点击标题下「大数据文摘」可快捷关注 导读:近日德勤咨询发布了《2020年健康医疗预测报告》,其中中国的医疗健康状况大数据让人触目惊心。面对压在中国居民身上的三座“健康大山”,用户究竟该如何翻山越岭,医疗服务究竟该如何颠覆,才可以让我们彻底地成为身体的主人?本文给出了一一解读。 近日,国际知名的咨询公司德勤咨询发布了《2020年健康医疗预测报告》,这其中也反映了中国人群的医疗大数据。 在总人口为13亿多的中国人中,中国高血压人口有1.6~1.7亿人,高血脂的有将1亿多人,糖尿病患者达到9240万人,超重或者
大数据文摘
2018/05/23
7370
药物重定位新框架,人工智能使「旧药新用」研究取得进展
这项工作的目的是加速药物的重新定位。药物重定位并不是一个新的概念,我们现在所熟知的用于减少皱纹出现的肉毒杆菌注射液,最初是被批准用于眼睛的治疗,现也可用于治疗偏头痛。
机器之心
2021/01/20
7560
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
世界卫生组织估计全世界每年有 1200 万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病
拓端
2023/01/11
1.2K0
基于bloomz-7b指令微调的中文医疗问诊大模型,实现智能问诊、医疗问答
本项目开源了基于医疗指令微调的中文医疗问诊模型:明医 (MING)。目前模型的主要功能如下:
汀丶人工智能
2024/02/22
4230
基于bloomz-7b指令微调的中文医疗问诊大模型,实现智能问诊、医疗问答
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
世界卫生组织估计全世界每年有 1200 万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病
拓端
2023/02/09
1.1K0
因果推断入门:为什么需要因果推断?
来源:PaperWeekly本文约13200字,建议阅读15+分钟本文是 Brady Neal 推出的因果推断课程 Introduction to Causal Inference 的中文笔记。 本文是 Brady Neal 推出的因果推断课程 Introduction to Causal Inference 的中文笔记,主要是参考 Lecture Notes 加上一些自己的理解。 课程主页: https://www.bradyneal.com/causal-inference-course Lectur
数据派THU
2022/09/14
2.1K0
因果推断入门:为什么需要因果推断?
Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW|附代码数据
最近我们被客户要求撰写关于Stata中的治疗效果的研究报告,包括一些图形和统计输出。
拓端
2023/04/20
4850
Nature子刊重磅综述:人脑功能的因果映射
绘制人类大脑功能图谱是神经科学的一个长期目标,它有望为大脑疾病的新治疗方法的开发提供信息。早期的人类大脑功能地图是基于脑损伤或脑刺激导致的功能变化的位置。随着时间的推移,这种方法在很大程度上被功能神经成像等技术所取代,这些技术可以识别出活动与行为或症状相关的大脑区域。尽管这些技术有优势,但它们揭示的是相关性,而不是因果关系。这给解释这些工具产生的数据和使用它们来开发大脑疾病的治疗方法带来了挑战。基于脑损伤和脑刺激的人类脑功能的因果图谱正在进行中。新的方法可以将这些因果信息来源与现代神经成像和电生理学技术相结合,以获得对特定大脑区域的功能的新见解。在这篇综述中,我们为转化研究提供了因果关系的定义,提出了一个连续体来评估人类脑图研究中的因果信息的相对强度,并讨论因果脑图的最新进展及其对发展治疗的相关关系。
悦影科技
2022/11/11
5830
推荐阅读
因果图模型:理解因果关系的强大工具
1.1K0
数据并非都是正态分布:三种常见的统计分布及其应用
5280
动态 | 谷歌大脑医疗影像研究新进展,通过视网膜影像预测心脑血管疾病风险
1K0
业界 | 通过分析视网膜图像诊断心脑血管疾病:谷歌大脑团队取得医疗深度学习新进展
8500
揭开因果图模型的神秘面纱:常用的因果图模型
2K0
NLPer,是时候重视因果推理了!这有一份杨笛一等撰写的综述
2690
【谷歌AI以眼识心】超越人类医生,从视网膜图像识别心脏病
1.4K0
【聚焦】从李亚鹏谢顶说起, 用大数据谈失败婚姻对人的打击
7130
R语言探索BRFSS数据可视化
7970
新冠病毒侵入人体全过程!从脚趾到大脑,科学家追踪到病毒对身体的巨大摧残
7250
知识图谱嵌入与因果推理的结合
7680
贝叶斯网络之父Judea Pearl:新因果科学与数据科学、人工智能的思考
3640
中国医疗大数据发布!怎样推翻你身上的“三座大山”?
7370
药物重定位新框架,人工智能使「旧药新用」研究取得进展
7560
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
1.2K0
基于bloomz-7b指令微调的中文医疗问诊大模型,实现智能问诊、医疗问答
4230
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
1.1K0
因果推断入门:为什么需要因果推断?
2.1K0
Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW|附代码数据
4850
Nature子刊重磅综述:人脑功能的因果映射
5830
相关推荐
因果图模型:理解因果关系的强大工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档