C#中的正则表达式

其中如果包含的字符串中包含双引号,那么就两个双引号表示,而不是反斜杠加上双引号(\”),也不是斜杠加上双引号(/”)

    正则表达式获取CSS里面的图片的例子,里面有URL里面的图片地址有双引号,要注意用两个双引号""表示

        static void Main(string[] args)
        {
            Regex reg = new Regex(@"url\(([‘""]?)(.+[^‘""])\1\)");  //注意里面的引号 要用双引号表示,而不是用反斜杠
            Console.WriteLine(reg.Match(@"{background-image:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);backgro")); //输出 url(//ssl.gstatic.com/ui/v1/menu/checkmark.png)

            Console.ReadKey();
        }

  带组名的后向引用在C#中是 \k<num> ,匹配重复单词的例子:

        static void Main(string[] args)
        {
            Regex reg = new Regex(@"\b(?<group>\w+ +)\k<group>");
            string str = "what the hell are you you talking about?";
            Console.WriteLine(reg.Match(str));

            Console.ReadKey();
        }

  在C#中new一个Regex对象的时候,第二个参数能够用枚举支持选择匹配模式,现在就来说说这些枚举值对正则的影响。

   模式              说明

   .SingleLine           点号能够匹配任何字符

   .Multiline            扩展^和$的匹配,使^和$能够匹配字符串内部的换行符

   .IgnorePatternWhitespace   设计宽松排列和注释模式

   .IgnoreCase          进行不区分大小写的匹配

    .ECMAScript           限制\w \s \d,令其只对ASCII字符有效

   .RightToLeft          传动装置的驱动过程不变,但是方向相反(从字符的末尾开始,向开头移动)

   .Compiled            多花些时间优化正则表达式,编译到dll里,占用多点内存,但是匹配更快。

   .ExplicitCapture        普通括号()在正常情况下是捕获型括号,但是在此模式下与(?:...)一样,之分组,不捕获

   RegexOptions.Compiled的意义

  使用RegexOptions.Compiled与不使用RegexOptions.Compiled的对比

  标准      不使用          使用

  启动速度    较快           较慢(最多60倍)

  内存占用    少            多(每个正则表达式占用5-15KB)

  匹配速度    一般           最多能提升10倍

  在使用了RegexOptons.Compiled时,在程序执行过程中,这块内存会一直被占用,无法被释放,因此仅对于那些经常被使用的正则表达式才适合使用此选项。

  ECMAScript模式

  要注意ECMAScript只能与下面的选项同时使用

  RegexOptons.IgnoreCase

  RegexOptons.Multiline

  RegexOptons.Compiled

  而且反斜线-数字不会有反向引用和十进制转移的二义性,因为它只能够表示反向引用。例如 \10 表示反向引用 \1 然后是文字0。如果没有启用该模式,则 \12 匹配的是ASCII进纸符linefeed。同时\w \d \s \W \D \S只能匹配ASCII。

  另外在C#中,分组的编号也需要注意。

  分组0是整个正则表达式匹配到的结果。

  然后依次是未命名分组。

  最后是命名分组。

  例如:

  (\w)(?<Num>\d+)(\s+)

   1   3     2

  特殊的Replacement处理

  Regex.Replace方法和Match.Result方法都可以接收能够进行特殊处理的replacement字符串。下面的字符序列会被匹配到的文本所替换:

  字符序列          替换内容

  $&              整个表达式匹配的文本,相当于$0

  $1  $2            对应编号的捕获分组所匹配的文本

  ${name}          对应命名捕获分组匹配的文本

  $‘             目标字符串中匹配文本之前的文本

  $‘             目标字符串中匹配文本之后的文本

   $$             单个$字符($1的显示为$$!)

  $_             正则原始目标字符串的副本

  $+             .NET中表示最后的那个捕获型括号匹配的文本

static void Main(string[] args)
        {
            Regex reg1 = new Regex(@"\d+");
            string str = reg1.Replace("123","insert into table where id = $&");
            Console.WriteLine(str);     //输出 insert into table where id = 123

            Regex reg2 = new Regex(@"1\+1=(\d)");
            string str2 = reg2.Replace("1+1=3","不是$1");
            Console.WriteLine(str2);    //输出 不是3

            Regex reg3 = new Regex(@"1\+1=(?<result>\d)");
            string str3 = reg3.Replace("1+1=3", "不是${result}");
            Console.WriteLine(str3);    //输出 不是3

            Regex reg4 = new Regex(@"\d+");
            string str4 = reg4.Replace("123ABC", "后面是$‘");  //匹配文本之后的文本
            Console.WriteLine(str4);    //输出 后面是ABCABC     为什么会输出 后面是ABCABC呢?因为$‘指的是ABC,然后替换掉原字符串中的123。不懂看多几次这句话

            Regex reg5 = new Regex(@"\d+");
            string str5 = reg5.Replace("ABC123", "前面是$`");  //ABC前面是ABC 符号是 1左边那个
            Console.WriteLine(str5);

            Regex reg6 = new Regex(@"\d+");
            string str6 = reg6.Replace("ABC123","右边原始输入字符串$_");
            Console.WriteLine(str6);    //输出 右边是原始字符串ABC123

            Console.ReadKey();
        }

关于.net中的正则装配件是用于构建正则表达式库的,保存在硬盘中,其他程序也能够调用,提高重用率。主要就是用到了Regex类的CompileToAssembly方法。   

2013-4-26  微雨,阴霾

今天,碰到一个非常有趣的问题,公司多了个客户,产品那边说添加关键词太辛苦,让我帮忙批量导入一批关键词。哥这几天正好在研究正则表达式呢,于是二话不说,立马应了下来。一看,Excel,算了NPOI还没学呢。于是复制到txt文本里。

格式如下:

中山大道

粤垦路

.....

天助我也,难度不大,而且看来这几天学的东西有用武之地了。于是立马有了以下代码

static void Main(string[] args)
{
  string str = File.ReadAllText(@"D:\daoru.txt", Encoding.Default);
  Regex reg = new Regex(@".+");
  string str1 = reg.Replace(str, "insert into Keyword values(196,‘admin1‘,‘admin1‘,‘$&‘)");
  File.WriteAllText(@"D:\123.txt", str1);

  Console.ReadKey();
}

  这是一个根据关键词生成SQL语句的方法,从D盘导入txt文本(在这个地方,碰到一个问题,因为关键词是中文,所以直觉上觉得应该用Utf-8编码去读,但是竟然出错了。于是上网查了一下,居然用Encoding.Default可以解决这个问题)。然后用正则表达式匹配到关键词。默认的new Regex() 点号.是不会匹配换行符的,因此非常适合关键词一行一个的,例如从Excel复制过来的时候。然后用Regex类提供的Replace将关键词替换成Sql语句,直接黏贴到数据库上全选,执行。OK。一次过导入了近500个关键词。

2013-4-27    晴

  本来以为正则表达式学得不错了,结果昨天替换的SQL语句就出了问题,存入数据库的数据无缘无故多了个换行符。其实在执行SQL语句的时候,SQLSERVER已经很尽职地给出提示了,可惜太大意或者说高兴得太早直接忽略了。来看昨天SQL语句执行时的图片:

  看到换行了吧,这样一来就会将在结果中多了个\r,在数据库表中还看不到,但是在用的时候,如果仅仅用于显示,也没问题,但是如果用来匹配,那就悲剧了。因此今天更改了程序。要将换行符替换掉。代码改为如下所示,其中改动部分红色标记:

        static void Main(string[] args)
        {
            string str = File.ReadAllText(@"D:\daoru.txt", Encoding.Default);
            Regex reg = new Regex(@".+");
            string str1 = reg.Replace(str, "insert into JM_SinaBlog_KeyWord values(105,‘jmeii‘,‘jmeii‘,‘$&‘)").Replace((char)13, (char)0);//here
            File.WriteAllText(@"D:\123.txt", str1);

            Console.ReadKey();
        }

  这样一来,就替换掉换行符了。将生成的代码再复制到SQLSERVER里,可以看到SQLSERVER的显示变了:

  

  这样就没问题了,以后在写正则表达式时要对换行,空格非常敏感才行。

时间: 2024-10-05 04:42:46

C#中的正则表达式的相关文章

JavaScript中的正则表达式(终结篇)

JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScript中的使用: JavaScript对正则表达式的支持程度 支持正则表达式的RegExp类型 RegExp的实例属性 RegExp的实例方法 RegExp的构造函数属性 简单的应用 第一部分:JavaScript对正则表达式的支持程度 之前我介绍了正则表达式的基本语法,如果大家不是很了解可以先看下面

Python中re(正则表达式)模块函数学习

今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. 方法/属性 作用 match() 决定 RE 是否在字符串刚开始的位置匹配 search() 扫描字符串,找到这个 RE 匹配的位置 findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回 finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 match() 函数只检查 RE 是否在字符串开始处匹配

Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

Coursera-Getting and Cleaning Data-Week4 Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周课程主要针对text进行处理.里面包括 1.变量名的处理 2.正则表达式 3.日期处理(参见swirl lubridate包练习) 首先,变量名的处理,奉行两个原则,1)统一大小写tolower/toupper:2)去掉在导入数据时,因为特殊字符导致的合并变量 3)不要重复:4)少用代码缩写 使用的函数包括 替换查找:

SQL Server中使用正则表达式

SQL Server 2005及以上版本支持用CLR语言(C# .NET.VB.NET)编写过程.触发器和函数,因此使得正则匹配,数据提取能够在SQL中灵活运用,大大提高了SQL处理字符串,文本等内容的灵活性及高效性. 操作步骤: 1.新建一个SQL Server项目(输入用户名,密码,选择DB),新建好后,可以在属性中更改的 2.新建一个类“RegexMatch.cs”,选择用户定义的函数 可以看到,该类为一个部分类:public partial class UserDefinedFuncti

String的replaceAll方法中的正则表达式用法

项目里面 需要对已手机号码进行 如下的显示 比如15088688388 要显示为150****8388的效果 实现这个简单的效果 方法有很多 我想试试用正则表达式去实现 查了点资料最终试出来以下方法可行 System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1****")); 输出结果:150****8388 首先对replaceAll方法的第一个参数进行解释 第一个参数

MySQL中的正则表达式

正则表达式是用正则表达式语言来建立 基本字符的匹配 .是正则表达式语言中的一个特殊的字符,它表示匹配任意一个字符 在LIKE和REGEXP之间有一个重要的差别,LIKE匹配整个列,如果被匹配的文本仅在列值中出现,LIKE将不会找到它,相应的行也不会被返回(除非使用通配符) 而REGEXP在列值内匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行也会被返回. MySQL中的正则表达式匹配默认不区分大小写,为区分大小写,可使用BINARY关键字,在REGEXP后面加上BINARY即

java 中的正则表达式

一. 什么是正则表达式? 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”).模式描述在搜索文本时要匹配的一个或多个字符串. 二.正则表达式语法参考: https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx.    三.  正则表达式规则的例子: /^(/d{3}-|/d{4}-)?(/d{8}|/d{7})?$/    //国内电话 /^[1-9]*[1-9][0-9]*$/  

C++、Java、JavaScript中的正则表达式

编程思想之正则表达式 什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗*浩":那么"罗*浩"就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text).再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开始

Python学习-38.Python中的正则表达式(二)

在Python中,正则表达式还有较其他编程语言有特色的地方.那就是支持松散正则表达式了. 在某些情况,正则表达式会写得十分的长,这时候,维护就成问题了.而松散正则表达式就是解决这一问题的办法. 用上一次分组的代码作为例子: 1 import re 2 userinput = input("please input test string:") 3 m = re.match(r'(\d{3,4})-(\d{8})',userinput) 4 if m: 5 print('区号:' + m

Python学习-37.Python中的正则表达式

作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. 1 import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何小写字符),$代表结尾,这些百科或者其他书籍都有. 例子一,字符串中是否包含数字: 1 import re 2 userinput = input("please input test string:") 3 if re.match(r'\d',userinput): 4 print(