惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
Know Your Adversary
Know Your Adversary
S
Securelist
T
Tor Project blog
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
NISL@THU
NISL@THU
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 热门话题
V
Vulnerabilities – Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
T
The Blog of Author Tim Ferriss
Security Latest
Security Latest
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tenable Blog
博客园_首页
TaoSecurity Blog
TaoSecurity Blog
Attack and Defense Labs
Attack and Defense Labs
Project Zero
Project Zero
The Hacker News
The Hacker News
M
MIT News - Artificial intelligence
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
K
Kaspersky official blog
F
Full Disclosure
WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
N
Netflix TechBlog - Medium
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
GbyAI
GbyAI
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
博客园 - 叶小钗
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN

博客园 - 西门潇洒

MSSQL批量写入数据方案 关于SQL连接 加条件查询的LINQ表达式写法 关于LINQ中实现随机查询数据库中记录 .NET新特性--扩展方法 Array中数据强制数据类型转换 the Project type is not supported by installation 项目类型不能正确加载 ASP.NET三层架构中数据绑定的问题 ASP.NET 2.0中XML数据的处理 小牛生产小牛的问题解决集粹 <转>自毁前程的七种行为 <转>在 ASP.NET 中执行 URL 重写 去除socket编程当中接收到的多余符\0 - 西门潇洒 - 博客园 将一段符合XML格式规范字符串插入已有XML文档当中 <转>如何C#中实现在TreeView查找某一节点 javascript正则表达式中使用变量关键字 <转>JavaScript 参考教程之对象化编程 <转>JavaScript 参考教程之JavaScript 简介 <转>JavaScript 参考教程之事件处理 <转>JavaScript 参考教程资料之文档对象
正则式中的实用命名组替换
西门潇洒 · 2008-01-09 · via 博客园 - 西门潇洒

刚在论坛上看到一个非常有意思的问题?

result   =   Regex.Replace(result,   @"( <a(?=[^ <> ]*?id=""t1"").*?href="")[^""]*(""[^> ]*> )[\s\S]*?(?= </a> )",   string.Format("$1{0}$2{1}",   textBox12.Text,   textBox11.Text),   RegexOptions.IgnoreCase);

我用上面的正则表达式想分别替换   <a   id="t1"   class=link_blue   href="http://article.ednchina.com/Commu/20071219071733.htm"> Infonetics:WiMAX设备销售额上升势头增强 </a>   中的红色部分,可是如果textBox12.Text中的字符是以数字开始的,替换就出现了问题,原文就被替换成为 <a   id="t1"   class=link_blue   href="http://article.ednchina.com/Other/20080108052252.htm$22008国际CES更“绿”了 </a>    
为什么把后面> 改为了$2,请问应该怎么解决呢?

原以为只是一个简单的正则替换问题,出现问题可能是正则式或是其它书写的原因.
仔细分析了一下,确实存在问题,事实证明不能小视任何的一个问题哈^_^

举个例子来说明问题:

string a = "<a   id=\"t1\"   class=link_blue   href=\"http://article.ednchina.com/Commu/20071219071733.htm\"> Infonetics:WiMAX设备销售额上升势头增强 </a> ";
string reValue = "1212";
string reValue1 = "CSDN";
            
string regex = "(<a[\\s\\S]*?id=\"t1\"[\\s\\S]*?href=\")[\\s\\S]*?(\"[^>]*?>)[^<]*?(\\</a>)";
string result = Regex.Replace(a, regex,string.Format("$1{0}$2{1}$3", reValue, reValue1));

上面的例子是一个普通的正则替换例子,一般情况下不会出现任何问题,不过并不是没有问题,以上的参数中就会出现我们所说的问题了,我们的reValue为1212为数学,当字符串连接起来的时候,你们的替换表达式就会生成为:
$11212$2CSDN$3这种形式.地球人都知道得不到正确的替换...
很明显现在非常命名组的引用已经不能解决我们的问题,所以我们今天所说的主角上场了.
${name}替换由组(?<name>)匹配的最后一个子串.
用这种方式去捕获匹配值,当然也就不会与数学冲突了,即写成

string r = Regex.Replace(a, regex, string.Format("${t1}{0}${t2}{1}${t3}", reValue, reValue1));

这种命名组替换模式,当然我们的替换模式都改了,当然我们的正则表达式也需要改了,几些天太大意了,忘记把修改成命名组匹配的正则表达式贴上来了,谢谢楼下朋友的提醒^_^,现在补上
修正为命名组匹配的正则表达式就应该为:

string regex = "(?<t1><a[\\s\\S]*?id=\"t1\"[\\s\\S]*?href=\")[\\s\\S]*?(?<t2>\"[^>]*?>)[^<]*?(?<t3>\\</a>)";

很郁闷,异常--!,输入字符串的格式不正确
很容易原因应该就是在string.Format中使用了花括号{},所以编译器就会把它误认为是一个格式项,也不知道是不是这样称呼^_^,还望朋友们指正,(下面的内容摘自MSDN)

格式项的语法是 {index[,alignment][:formatString]},它指定了一个强制索引、格式化文本的可选长度和对齐方式,以及格式说明符字符的可选字符串,其中格式说明符字符用于控制如何设置相应对象的值的格式。格式项的组成部分包括:

index

从零开始的整数,指示对象列表中要格式化的元素。如果由 index 指定的对象是 空引用(在 Visual Basic 中为 Nothing),则格式项将被空字符串 ("") 替换。

alignment

可选整数,指示包含格式化值的区域的最小宽度。如果格式化值的长度小于 alignment,则用空格填充该区域。如果 alignment 为负,则格式化的值将在该区域中左对齐;如果 alignment 为正,则格式化的值将右对齐。如果没有指定 alignment,则该区域的长度为格式化值的长度。如果指定 alignment,则需使用逗号。

formatString

可选的格式说明符字符串。如果没有指定 formatString,并且对应的参数实现了 IFormattable 接口,则将 空引用(在 Visual Basic 中为 Nothing) 用作 IFormattable.ToString 格式字符串。因此,IFormattable.ToString 的所有实现都必须允许 空引用(在 Visual Basic 中为 Nothing) 作为格式字符串,并以 String 对象的形式返回对象表示形式的默认格式设置。如果指定 formatString,则必须使用冒号。

必须使用前导大括号字符和后缀大括号字符,即“{”和“}”。若要在 format 中指定单个大括号字符,请指定两个前导大括号字符或后缀大括号字符(即“{{”或“}}”)。

问题弄清楚了,解决方案也找到了^_^
只需要把上面的替换表达式改为

string r = Regex.Replace(a, regex, string.Format("${{t1}}{0}${{t2}}{1}${{t3}}", reValue, reValue1));

问题就可以得到解决,也可以不采用string.Format格式项的方式.直接采用原始的字符串拼接,也可实现

string result = Regex.Replace(a, regex, "${t1}"+reValue+"${t2}"+reValue1+"${t3}");

哎,总算说清楚了,不过貌似有很多费话,希望朋友们表丢砖头^_^