比如:输入字符串为<a href="#">112233test112233</a>123test123
使正则表达式
匹配123test123中的test,
而不匹配<a href="#">112233test112233</a>中的test
大虾帮助一下啊。
21 个解决方案
#1
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"(<a.*?>.*?test.*?</a>.*)test(.*)","$1替换$2");
Response.Write(str);
str = System.Text.RegularExpressions.Regex.Replace(str,"(<a.*?>.*?test.*?</a>.*)test(.*)","$1替换$2");
Response.Write(str);
#2
感谢cpp2017(幕白兄) 。
可是,我是想替换一个网页中不在a标记中的test字符,
试了一下不行啊,能不能再改进一下啊。
可是,我是想替换一个网页中不在a标记中的test字符,
试了一下不行啊,能不能再改进一下啊。
#3
能不能把你要替换的字符发出来。我来试试。
#4
ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>
#5
半年前就遇到过这个问题,没有解决,半年后的现在又遇到这个问题了,
希望高人帮帮忙。
希望高人帮帮忙。
#6
替换一个网页中不在a标记中的X字符,
比如把www.csdn.net首页HTML代码中,把没有链接的“C++”三个字符替换成“XXX”
其实关键就在如何匹配不是</a>前面的C++,
正则表达式一般都是匹配一个什么什么字符(字符串),但是很少用到不匹配一个什么什么字符串的,
就上面说的匹配C++后面没有</a>的字符串,(C++和</a>之间可以有其它字符)
比如把www.csdn.net首页HTML代码中,把没有链接的“C++”三个字符替换成“XXX”
其实关键就在如何匹配不是</a>前面的C++,
正则表达式一般都是匹配一个什么什么字符(字符串),但是很少用到不匹配一个什么什么字符串的,
就上面说的匹配C++后面没有</a>的字符串,(C++和</a>之间可以有其它字符)
#7
(test(?=[^<>]*<a))|(</a>[^<>]*?test)
这样你试试,就是匹配<a>之前,或</a>之后的.也许不符合你实际
这样你试试,就是匹配<a>之前,或</a>之后的.也许不符合你实际
#8
没有C#环境,javascript这么写:
function f(){
s='ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>ssdfssftestdfs';
r=/test(?=[^<a[^<>]*<a)|(<\/a>[^<>]*?)test/gi;
s=s.replace(r,function(a){return a.replace("test","8888");});
alert(s);
}
function f(){
s='ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>ssdfssftestdfs';
r=/test(?=[^<a[^<>]*<a)|(<\/a>[^<>]*?)test/gi;
s=s.replace(r,function(a){return a.replace("test","8888");});
alert(s);
}
#9
j9988(j9988) 的(test(?=[^<>]*<a))|(</a>[^<>]*?test)在某些情况下可以使用,
test字符串不仅在a标签中,在b,font,td中也不能匹配,需要在a中不能匹配,在其它标签中可以匹配,
同样谢谢j9988(j9988) 的参与,
test字符串不仅在a标签中,在b,font,td中也不能匹配,需要在a中不能匹配,在其它标签中可以匹配,
同样谢谢j9988(j9988) 的参与,
#10
正则用得不好,只能用笨办法了。
string str = "<b test>ssdfssftestdfs<a href=\"test.aspx\">ssdfssftestdfs</a>ssdfssftestdfs<a href=\"test.aspx\" >ssdfssftestdfs</a>";
Response.Write(Server.HtmlEncode(str)+"<BR>");
string id = "A"+ Guid.NewGuid().ToString();
str = Regex.Replace(str,"<a([^>]*)?test([^>]*)>","<a$1"+id+"$2>");
str = Regex.Replace(str,"(<a[^>]*>)([^<]*)test([^<]*)</a>","$1$2"+id+"$3</a>");
str =str.Replace("test","替换");
str =str.Replace(id,"test");
Response.Write(Server.HtmlEncode(str)+"<BR>");
string str = "<b test>ssdfssftestdfs<a href=\"test.aspx\">ssdfssftestdfs</a>ssdfssftestdfs<a href=\"test.aspx\" >ssdfssftestdfs</a>";
Response.Write(Server.HtmlEncode(str)+"<BR>");
string id = "A"+ Guid.NewGuid().ToString();
str = Regex.Replace(str,"<a([^>]*)?test([^>]*)>","<a$1"+id+"$2>");
str = Regex.Replace(str,"(<a[^>]*>)([^<]*)test([^<]*)</a>","$1$2"+id+"$3</a>");
str =str.Replace("test","替换");
str =str.Replace(id,"test");
Response.Write(Server.HtmlEncode(str)+"<BR>");
#11
这个就要用到正则表达式中的所谓“预查询不匹配”
javascript下我测试通过:
var str = "<a href=\"#\">112233test112233</a>123test123";
var str2 = str.replace(/test(?![^<]*<\/a>)/g,"");
alert(str2);
楼主改为asp.net中你对应语言的语法即可。我对asp.net下不太清楚,未测试:
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"test(?![^<]*</a>)","");
Response.Write(Server.HtmlEncode(str));
另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。
javascript下我测试通过:
var str = "<a href=\"#\">112233test112233</a>123test123";
var str2 = str.replace(/test(?![^<]*<\/a>)/g,"");
alert(str2);
楼主改为asp.net中你对应语言的语法即可。我对asp.net下不太清楚,未测试:
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"test(?![^<]*</a>)","");
Response.Write(Server.HtmlEncode(str));
另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。
#12
UP`
#13
//假如要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
#14
cuixiping(无心) 的好,学习……
#15
呵呵,我认为我的更符合楼主的要求。
#16
cuixiping(无心) 的不行
没有考虑周全,我用正则表达式测试工具测试出了
当<a href="#">112233a112233</a>123a123
要替换a那么html标签里面的也被匹配了.
没有考虑周全,我用正则表达式测试工具测试出了
当<a href="#">112233a112233</a>123a123
要替换a那么html标签里面的也被匹配了.
#17
呵呵,我的思想:
将所有test和a标签的内容都用正则匹配出来(由于a标签中的test肯定在<a之后,所以一定会优先匹配<a标签),在替换的方法里面去判断,如果匹配的是test,那么直接替换,如果不是,则用匹配到的原值去替换(其实就是不替换):
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
将所有test和a标签的内容都用正则匹配出来(由于a标签中的test肯定在<a之后,所以一定会优先匹配<a标签),在替换的方法里面去判断,如果匹配的是test,那么直接替换,如果不是,则用匹配到的原值去替换(其实就是不替换):
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
#18
to winner2050(winner),
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g
#19
看了大家的讨论,再跟据楼主后几次发言中的需求.我想很难一次匹配替换.
我还是比较认同cpp2017(幕白兄)第二次方案. 就是分多次匹配处理.
你得把html文档中先匹配出你标题需求中的这些段内容.
再第二次匹配要替换的test.最后替换.
我还是比较认同cpp2017(幕白兄)第二次方案. 就是分多次匹配处理.
你得把html文档中先匹配出你标题需求中的这些段内容.
再第二次匹配要替换的test.最后替换.
#20
测试下
#21
感谢大家支持
(?!<)a(?![^<]*<\/a>
test(?![^<]*<\/a>)
和
/***********************************/
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
/***********************************/
在我的需求中都可以使用。
(?!<)a(?![^<]*<\/a>
test(?![^<]*<\/a>)
和
/***********************************/
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
/***********************************/
在我的需求中都可以使用。
#1
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"(<a.*?>.*?test.*?</a>.*)test(.*)","$1替换$2");
Response.Write(str);
str = System.Text.RegularExpressions.Regex.Replace(str,"(<a.*?>.*?test.*?</a>.*)test(.*)","$1替换$2");
Response.Write(str);
#2
感谢cpp2017(幕白兄) 。
可是,我是想替换一个网页中不在a标记中的test字符,
试了一下不行啊,能不能再改进一下啊。
可是,我是想替换一个网页中不在a标记中的test字符,
试了一下不行啊,能不能再改进一下啊。
#3
能不能把你要替换的字符发出来。我来试试。
#4
ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>
#5
半年前就遇到过这个问题,没有解决,半年后的现在又遇到这个问题了,
希望高人帮帮忙。
希望高人帮帮忙。
#6
替换一个网页中不在a标记中的X字符,
比如把www.csdn.net首页HTML代码中,把没有链接的“C++”三个字符替换成“XXX”
其实关键就在如何匹配不是</a>前面的C++,
正则表达式一般都是匹配一个什么什么字符(字符串),但是很少用到不匹配一个什么什么字符串的,
就上面说的匹配C++后面没有</a>的字符串,(C++和</a>之间可以有其它字符)
比如把www.csdn.net首页HTML代码中,把没有链接的“C++”三个字符替换成“XXX”
其实关键就在如何匹配不是</a>前面的C++,
正则表达式一般都是匹配一个什么什么字符(字符串),但是很少用到不匹配一个什么什么字符串的,
就上面说的匹配C++后面没有</a>的字符串,(C++和</a>之间可以有其它字符)
#7
(test(?=[^<>]*<a))|(</a>[^<>]*?test)
这样你试试,就是匹配<a>之前,或</a>之后的.也许不符合你实际
这样你试试,就是匹配<a>之前,或</a>之后的.也许不符合你实际
#8
没有C#环境,javascript这么写:
function f(){
s='ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>ssdfssftestdfs';
r=/test(?=[^<a[^<>]*<a)|(<\/a>[^<>]*?)test/gi;
s=s.replace(r,function(a){return a.replace("test","8888");});
alert(s);
}
function f(){
s='ssdfssftestdfs<a href="test.aspx">ssdfssftestdfs</a>ssdfssftestdfs<a href="test.aspx" >ssdfssftestdfs</a>ssdfssftestdfs';
r=/test(?=[^<a[^<>]*<a)|(<\/a>[^<>]*?)test/gi;
s=s.replace(r,function(a){return a.replace("test","8888");});
alert(s);
}
#9
j9988(j9988) 的(test(?=[^<>]*<a))|(</a>[^<>]*?test)在某些情况下可以使用,
test字符串不仅在a标签中,在b,font,td中也不能匹配,需要在a中不能匹配,在其它标签中可以匹配,
同样谢谢j9988(j9988) 的参与,
test字符串不仅在a标签中,在b,font,td中也不能匹配,需要在a中不能匹配,在其它标签中可以匹配,
同样谢谢j9988(j9988) 的参与,
#10
正则用得不好,只能用笨办法了。
string str = "<b test>ssdfssftestdfs<a href=\"test.aspx\">ssdfssftestdfs</a>ssdfssftestdfs<a href=\"test.aspx\" >ssdfssftestdfs</a>";
Response.Write(Server.HtmlEncode(str)+"<BR>");
string id = "A"+ Guid.NewGuid().ToString();
str = Regex.Replace(str,"<a([^>]*)?test([^>]*)>","<a$1"+id+"$2>");
str = Regex.Replace(str,"(<a[^>]*>)([^<]*)test([^<]*)</a>","$1$2"+id+"$3</a>");
str =str.Replace("test","替换");
str =str.Replace(id,"test");
Response.Write(Server.HtmlEncode(str)+"<BR>");
string str = "<b test>ssdfssftestdfs<a href=\"test.aspx\">ssdfssftestdfs</a>ssdfssftestdfs<a href=\"test.aspx\" >ssdfssftestdfs</a>";
Response.Write(Server.HtmlEncode(str)+"<BR>");
string id = "A"+ Guid.NewGuid().ToString();
str = Regex.Replace(str,"<a([^>]*)?test([^>]*)>","<a$1"+id+"$2>");
str = Regex.Replace(str,"(<a[^>]*>)([^<]*)test([^<]*)</a>","$1$2"+id+"$3</a>");
str =str.Replace("test","替换");
str =str.Replace(id,"test");
Response.Write(Server.HtmlEncode(str)+"<BR>");
#11
这个就要用到正则表达式中的所谓“预查询不匹配”
javascript下我测试通过:
var str = "<a href=\"#\">112233test112233</a>123test123";
var str2 = str.replace(/test(?![^<]*<\/a>)/g,"");
alert(str2);
楼主改为asp.net中你对应语言的语法即可。我对asp.net下不太清楚,未测试:
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"test(?![^<]*</a>)","");
Response.Write(Server.HtmlEncode(str));
另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。
javascript下我测试通过:
var str = "<a href=\"#\">112233test112233</a>123test123";
var str2 = str.replace(/test(?![^<]*<\/a>)/g,"");
alert(str2);
楼主改为asp.net中你对应语言的语法即可。我对asp.net下不太清楚,未测试:
string str = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"test(?![^<]*</a>)","");
Response.Write(Server.HtmlEncode(str));
另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。
#12
UP`
#13
//假如要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
#14
cuixiping(无心) 的好,学习……
#15
呵呵,我认为我的更符合楼主的要求。
#16
cuixiping(无心) 的不行
没有考虑周全,我用正则表达式测试工具测试出了
当<a href="#">112233a112233</a>123a123
要替换a那么html标签里面的也被匹配了.
没有考虑周全,我用正则表达式测试工具测试出了
当<a href="#">112233a112233</a>123a123
要替换a那么html标签里面的也被匹配了.
#17
呵呵,我的思想:
将所有test和a标签的内容都用正则匹配出来(由于a标签中的test肯定在<a之后,所以一定会优先匹配<a标签),在替换的方法里面去判断,如果匹配的是test,那么直接替换,如果不是,则用匹配到的原值去替换(其实就是不替换):
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
将所有test和a标签的内容都用正则匹配出来(由于a标签中的test肯定在<a之后,所以一定会优先匹配<a标签),在替换的方法里面去判断,如果匹配的是test,那么直接替换,如果不是,则用匹配到的原值去替换(其实就是不替换):
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
#18
to winner2050(winner),
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g
#19
看了大家的讨论,再跟据楼主后几次发言中的需求.我想很难一次匹配替换.
我还是比较认同cpp2017(幕白兄)第二次方案. 就是分多次匹配处理.
你得把html文档中先匹配出你标题需求中的这些段内容.
再第二次匹配要替换的test.最后替换.
我还是比较认同cpp2017(幕白兄)第二次方案. 就是分多次匹配处理.
你得把html文档中先匹配出你标题需求中的这些段内容.
再第二次匹配要替换的test.最后替换.
#20
测试下
#21
感谢大家支持
(?!<)a(?![^<]*<\/a>
test(?![^<]*<\/a>)
和
/***********************************/
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
/***********************************/
在我的需求中都可以使用。
(?!<)a(?![^<]*<\/a>
test(?![^<]*<\/a>)
和
/***********************************/
//假设要把test替换成http://www.123du.com
string str = @"<a href=""#"">112233test112233</a>123test123";
string reg = @"test|<a[^>]*?>[^<]*?</a>";
str = Regex.Replace(str, reg, new MatchEvaluator(DoReplace), RegexOptions.IgnoreCase);
MessageBox.Show(str);//"<a href="#">112233test112233</a>123http://www.123du.com123"
....
string DoReplace(Match m)
{
if (m.Value == "test")
{
return "http://www.123du.com";
}
return m.Value;
}
/***********************************/
在我的需求中都可以使用。