C#中的正则表达式双引号问题

 更新时间:2020年6月25日 11:29  点击:1713

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

  正则表达式获取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方法。   

今天,碰到一个非常有趣的问题,公司多了个客户,产品那边说添加关键词太辛苦,让我帮忙批量导入一批关键词。哥这几天正好在研究正则表达式呢,于是二话不说,立马应了下来。一看,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个关键词。

  本来以为正则表达式学得不错了,结果昨天替换的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的显示变了:

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

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • PostgreSQL 中的单引号与双引号用法说明

    这篇文章主要介绍了PostgreSQL 中的单引号与双引号用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • js用正则表达式筛选年月日的实例方法

    在本篇文章里小编给大家整理的是一篇关于js用正则表达式筛选年月日的实例方法,对此有兴趣的朋友们可以学习下。...2021-01-04
  • javascript 手机号码正则表达式验证函数 <font color=red>原创</font>

    随着手机号码段的不断增加,以前网上的手机号码验证函数都不能那么完美的支持了,这里脚本之家编辑特为大家准备的一个简单的正则与手机验证的函数分析。...2021-05-07