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

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

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

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

  ?

1
2
3
4
5
6
7

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 ,匹配重复单词的例子:

  ?

1
2
3
4
5
6
7
8

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)(?d+)(s+)

  1   3     2

  特殊的Replacement处理

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

  字符序列          替换内容

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

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

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

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

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

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

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

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

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

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文本里。

  格式如下:

  中山大道

  粤垦路

  .....

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

  ?

1
2
3
4
5
6
7
8
9

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,在数据库表中还看不到,但是在用的时候,如果仅仅用于显示,也没问题,但是如果用来匹配,那就悲剧了。因此今天更改了程序。要将换行符替换掉。代码改为如下所示,其中改动部分红色标记:

  ?

1
2
3
4
5
6
7
8
9

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-12-28 06:52:38

C#中的正则表达式双引号问题的相关文章

字符串中的单双引号

(1)&是连接运算符,它可以将两个字符串连接成一个字符串.       EG1:a="abc" & "def"         执行连接运算后,a="abcdef"       EG2: a="abc" & temp       注意,这里temp是一个字符串变量,假如temp="def",那么代入上面的式子,则结果为:          a="abc" &

求问一个Java Web中EasyUI linkbuttion的dataoption中的iconCls 双引号转义问题

问题描述 最近在做项目的时候,有一个表单是,其中有一行是这样的<tr><th>RFID标签:</th><tdcolspan="4"><inputid="rfidLabelnum"onblur="checkrfid(this)"name="rfidLabelnumber"class="easyui-validatebox"data-options=&quo

php中如何输出双引号&quot;与单引号'

我们都知道在php中双引号和单引号中的内容是字符串,如何把双引号和单引号输出出来呢?下面我们来看下面的实例: 首先我们来看输出双引号的几种方法 方法一. */ $str ='我要输出双引号"'; echo $str; /* 结果为:我要输出双引号" 方法二  */ $str ="输出双引号""; echo $str; //结果输出双引号" //输出单引号与双引号差不多看实例 $str ="输出单引号'" $str1='输出单旨

浅析Js中的单引号与双引号问题_javascript技巧

单引号和双引号其实没啥区别,看你自己习惯了 <input type="button" onclick="alert("1")">-------------------不正确<input type="button" onclick="alert('1')">-------------------正确 双引号中再用双引号要这样:var str = "abc\"def\

[ASP|HTML]单引与双引号

可能接触网站与编程设计的人都知道,一个属性值需要引号包括起来,但是有的时候就是因为没有正确设定引号类型,导致程序出错,就连我自己也是这样,我自己问自己:明明写的是对的,怎么就错了呢?原来在设定引号类型之后在引号类型里面不可以在有相同的引号出现,否则才会让程序出错!那就让我在这里来介绍几种可能发生的错误吧! JAVASCRIPT中容易出错的地方: ① 错误: 引用: <a href="javascript:window.open("http://51js.com")&qu

php中单双引号的区别

  " " 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出. ' ' 单引号里面的不进行解释,直接输出. 从字面意思上就可以看出,单引号比双引号要快了. 例如: $abc='my name is tome'; echo $abc //结果是:my name is tom echo '$abc' //结果是 abc echo "$abc" //结果是:my name is tom 特别在使用MYSQL语句的时候,双引号和单引号的用法让新手不知所措,在这里

javascript单引号和双引号的区别和处理_基础知识

单引号和双引号其实没啥区别,看你自己习惯了 复制代码 代码如下: <input type="button" onclick="alert("1")">-------------------不正确 <input type="button" onclick="alert('1')">-------------------正确 双引号中再用双引号要这样: var str = "a

PHP中的双引号和单引号的应用

无论是书写 JavaScript 还是 PHP,总习惯于使用单引号.但周末在家 coding 的时候碰到个问题,需要通过 PHP 过滤字符串中的换行符,按照下面的方法操作: $out = str_replace(array('rn', 'r', 'n'), '', $out);PHP 提供三种定义字符串的方法:单引号.双引号.本地文档(英文叫做 here document 或者 heredoc). 单引号: 使用单引号是最高效的方法,因为 PHP 不会检查单引号字符串中的内置变量和转义序列,需要

php 中 define 定义常量和单双引号问题

一.define定义常量问题        <?php   define('DATABASE', 'MYSQL');   define('DATABASE_USER', 'ROOT');   define('DATABASE_PASSWORD', 'PASSWORD');   ?>                直接使用"DATABASE"常量,代表的就是"MYSQL".                $arr = array('fruit'=>'