vs2008使用正则替换

q523053 2010-05-06 07:53:33
比如以下文本:
char szAccept[] = "Accept: */*";
char szReferer[] = "Referer: http://mail.sina.com.cn/\r\n";

将之替换成:
char szAccept[] = _T("Accept: */*");
char szReferer[] = _T("Referer: http://mail.sina.com.cn/\r\n");

使用正则查找内容:".*?"
替换为:_T(".*?")
弹出"未找到以下内容".*?""

...全文
287 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
i迷ni 2011-12-08
  • 打赏
  • 举报
回复
查找和替换用的正则表达式,功能不算很强,好像没有懒惰匹配,所以应该尽量匹配精确一点。

试试这个
查找内容:char szAccept\[\] = {:q};
替换为: char szAccept[] = _T(\1);

另一个同理。

兔子-顾问 2010-05-06
  • 打赏
  • 举报
回复
如果是自己写工具。可以考虑上\"的情况,使用
"(\\"|.)*?"
        private void TestRegex20()
{
string yourStr = @"char szAccept[] = ""Accept:+"" + str + "" */*"";
char szReferer[] = ""Referer: http://mail.sina.com.cn/\r\n"";
";
//string result = Regex.Replace(yourStr, @"(?isn)(?<front>char\s*(?!\d)\w+\w*?(\[\]|\*) *= *)(?<text>"".*?"")(?<end> *;)", "$1L$2$3");
//如果你反复使用,或是考虑已经替换过的不会再次替换,可以这样做,
string result = Regex.Replace(yourStr, @"""(\\""|.)*?""", "L$&");
MessageBox.Show(result);
//如果你认为还是TEXT()好看,这样修改也成
result = Regex.Replace(yourStr, @"""(\\""|.)*?""", "TEXT($&)");
MessageBox.Show(result);
}


结果:

char szAccept[] = TEXT("Accept:+") + str + TEXT(" */*");
char szReferer[] = TEXT("Referer: http://mail.sina.com.cn/\r\n");

pei2lala 2010-05-06
  • 打赏
  • 举报
回复
可以查找的 只不过是vs里的正则和我们正常使用的正则是有区别的

你用

"char szAccept\[\] = \\"Accept\: \*/\*\\";char szReferer\[\] = \\"Referer\: http\://mail.sina.com.cn\\"

这个查找一下
兔子-顾问 2010-05-06
  • 打赏
  • 举报
回复
-_-

编译器中自带的正则规则和这个不同的。自己写个程序来转。
q523053 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
C# code
private void TestRegex19()
{
string yourStr = @"char szAccept[] = ""Accept: */*"";
char szReferer[] = ""Referer: http://mail.sina.com.cn/\r\n"";
";
……
[/Quote]非常感谢!
        protected void Button1_Click(object sender, EventArgs e)
{
string yourStr = "char szAccept[] = \"Accept: */*\";char szReferer[] = \"Referer: http://mail.sina.com.cn\";test=\"abc\"+\"def\";test2=\"I say\"aaa\"\"";

//string result = Regex.Replace(yourStr, @"(?isn)(?<front>char\s*(?!\d)\w+\w*?(\[\]|\*) *= *)(?<text>"".*?"")(?<end> *;)", "$1L$2$3");
//如果你反复使用,或是考虑已经替换过的不会再次替换,可以这样做,
string result = Regex.Replace(yourStr, @"(?<!_T\(|L)"".+?""(?= *;)", "L$&");
Label1.Text=(result);
//如果你认为还是TEXT()好看,这样修改也成
result = Regex.Replace(yourStr, @"(?<!_T\(|L)"".+?""", "_T($&)");
Label2.Text=(result);

}
如果文本是这样的: string yourStr = "char szAccept[] = \"Accept: */*\";char szReferer[] = \"Referer: http://mail.sina.com.cn\";test=\"abc\"+\"def\";test2=\"I say\"aaa\"\"";

要考虑文本中两个"中间也有"的情况,在代码里写成str=\"test\"test\"
不一定结尾是;有可能是\"abc\"+\"cdf\"的情况

写成程序测试是成功的,在vs2008里Ctrl+H替换怎么都找不到?
兔子-顾问 2010-05-06
  • 打赏
  • 举报
回复
3楼方法是替换所有的赋值,对于MessageBox中的不替换,如果都替换,你就去掉表达式末尾的断言
(?= *;)这块就可以了。但是这样比较危险
兔子-顾问 2010-05-06
  • 打赏
  • 举报
回复
        private void TestRegex19()
{
string yourStr = @"char szAccept[] = ""Accept: */*"";
char szReferer[] = ""Referer: http://mail.sina.com.cn/\r\n"";
";
//string result = Regex.Replace(yourStr, @"(?isn)(?<front>char\s*(?!\d)\w+\w*?(\[\]|\*) *= *)(?<text>"".*?"")(?<end> *;)", "$1L$2$3");
//如果你反复使用,或是考虑已经替换过的不会再次替换,可以这样做,
string result = Regex.Replace(yourStr, @"(?<!TEXT\(|L)"".+?""(?= *;)", "L$&");
MessageBox.Show(result);
//如果你认为还是TEXT()好看,这样修改也成
result = Regex.Replace(yourStr, @"(?<!TEXT\(|L)"".+?""(?= *;)", "TEXT($&)");
MessageBox.Show(result);
}
兔子-顾问 2010-05-06
  • 打赏
  • 举报
回复
是给加上UNICODE标记是吧。不用那么麻烦,字符串前面写个L就可以了。
        private void TestRegex19()
{
string yourStr = @"char szAccept[] = ""Accept: */*"";
char szReferer[] = ""Referer: http://mail.sina.com.cn/\r\n"";
";
string result = Regex.Replace(yourStr, @"(?isn)(?<front>char\s*(?!\d)\w+\w*?(\[\]|\*) *= *)(?<text>"".*?"")(?<end> *;)", "$1L$2$3");
MessageBox.Show(result);
}
threenewbee 2010-05-06
  • 打赏
  • 举报
回复
\".*?\"
xrongzhen 2010-05-06
  • 打赏
  • 举报
回复
wuyazhe的正则用的真灵活

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧