广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#基础知识之字符串和正则表达式
  • 371
分享到

C#基础知识之字符串和正则表达式

2024-04-02 19:04:59 371人浏览 安东尼
摘要

目录Stringstring 和 stringbuilder字符串格式$前缀StringFORMat转义花括号日期时间和数字的格式正则表达式组总结String System.Stri

String

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

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

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

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

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

string 和 stringbuilder

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

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

var sb = new StringBuilder("Hello");

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

字符串格式

$前缀

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

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

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

StringFormat

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

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

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

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

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

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

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

解读为:

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

转义花括号

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

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

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

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

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

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

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

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

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

string formatstring = "Hello, {0}";

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

WriteLine("Hello, World");

日期时间和数字的格式

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

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

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

Friday, February 14, 2025 
2/14/2025

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

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

结果如下:

14-Feb-2025

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

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

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"
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枚举的一些成员。

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

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

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();
}

总结

到此这篇关于C#基础知识之字符串和正则表达式的文章就介绍到这了,更多相关C#字符串和正则表达式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#基础知识之字符串和正则表达式

本文链接: https://www.lsjlt.com/news/168998.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#基础知识之字符串和正则表达式
    目录Stringstring 和 stringbuilder字符串格式$前缀StringFormat转义花括号日期时间和数字的格式正则表达式组总结String System.Stri...
    99+
    2022-11-13
  • 正则表达式基础知识点有哪些
    这篇“正则表达式基础知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“正则表达式基础知识点有哪些”文章吧。正则表达式...
    99+
    2023-07-05
  • Python正则表达式基础知识有哪些
    本篇内容主要讲解“Python正则表达式基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python正则表达式基础知识有哪些”吧!1. 什么是正则表达式正则表达式(Regular E...
    99+
    2023-06-21
  • Python 正则表达式基础知识点及实例
    1. 什么是正则表达式 正则表达式(Regular Expressions),也称为 “regex” 或 “regexp” 是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符...
    99+
    2022-11-12
  • PHP正则表达式之如何分割字符串与转义字符串
    这篇文章主要介绍“PHP正则表达式之如何分割字符串与转义字符串”,在日常操作中,相信很多人在PHP正则表达式之如何分割字符串与转义字符串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP正则表达式之如何分割...
    99+
    2023-06-25
  • C#字符串与正则表达式的图文详解
    1.创建字符串 string 变量名 = "字符串内容";            string str = "abcdrf";             Conso...
    99+
    2022-11-13
  • java学习指南之字符串与正则表达式
    目录String构造方法格式控制字符串常用方法StringBuilder与StringBuffer特点理解可变与不可变字符串拼接方法字符串删除方法字符串内插入字符字符串替换方法字符串...
    99+
    2023-05-18
    java 字符串正则 java中正则表达式 java字符串与正则表达式
  • C#中如何使用正则表达式和字符串匹配
    C#中如何使用正则表达式和字符串匹配正则表达式是一种强大的文本处理工具,它可以帮助我们有效地在字符串中进行模式匹配和提取。在C#中,通过使用System.Text.RegularExpressions命名空间下的Regex类,我们可以轻松地...
    99+
    2023-10-22
    正则表达式 (Regex) 字符串匹配 (string matching) C#编程 (C# Programming)
  • 正则表达式之字符串模式匹配实例详解
    目录前言什么是正则表达式字符范围匹配元字符多次重复匹配定位匹配贪婪模式与非贪婪模式表达式分组结语前言 今天我们来学习正则表达式,正则表达式的应用十分广泛,几乎每个涉及到交互的项目都会...
    99+
    2022-11-13
  • C#正则表达式字符串搜索内容有哪些
    本篇内容介绍了“C#正则表达式字符串搜索内容有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#正则表达式及字符串搜索1、正则表达式简介...
    99+
    2023-06-17
  • JAVA正则表达式及字符串的替换与分解相关知识总结
    JAVA正则表达式及字符串的替换与分解 Java 提供了 java.util.regex 包来与正则表达式进行模式匹配 java.util.regex 包主要包括以下三个类: Pat...
    99+
    2022-11-12
  • ES6中正则表达式和字符串正则方法的示例分析
    这篇文章给大家分享的是有关ES6中正则表达式和字符串正则方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。RegExp构造函数在ES5中,RegExp构造函数的参数有两...
    99+
    2022-10-19
  • C#中怎么利用正则表达式匹配相关字符串
    今天就跟大家聊聊有关C#中怎么利用正则表达式匹配相关字符串,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用C#中使用正则表达式System.Text.RegularExpressi...
    99+
    2023-06-17
  • 如何使用C#中的Regex.MatchCollection函数获取字符串中所有符合正则表达式的部分
    如何使用C#中的Regex.MatchCollection函数获取字符串中所有符合正则表达式的部分,需要具体代码示例正则表达式是一种强大的模式匹配工具,在C#中,可以使用Regex.MatchCollection函数来获取字符串中所有符合正...
    99+
    2023-11-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作