正则表达式怎么样匹配不在a标签中的字符串test

时间:2022-01-22 06:01:00
如题

比如:输入字符串为<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);

#2


感谢cpp2017(幕白兄) 。

可是,我是想替换一个网页中不在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>之间可以有其它字符)

#7


(test(?=[^<>]*<a))|(</a>[^<>]*?test)

这样你试试,就是匹配<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);
}

#9


j9988(j9988) 的(test(?=[^<>]*<a))|(</a>[^<>]*?test)在某些情况下可以使用,
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>");

#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));

另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。

#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;
}

#14


cuixiping(无心) 的好,学习……

#15


呵呵,我认为我的更符合楼主的要求。

#16


cuixiping(无心) 的不行
没有考虑周全,我用正则表达式测试工具测试出了

当<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;
}

#18


to winner2050(winner),
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g

#19


看了大家的讨论,再跟据楼主后几次发言中的需求.我想很难一次匹配替换.
我还是比较认同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;
}
/***********************************/
在我的需求中都可以使用。

#1


string str  = "<a href=\"#\">112233test112233</a>123test123";
str = System.Text.RegularExpressions.Regex.Replace(str,"(<a.*?>.*?test.*?</a>.*)test(.*)","$1替换$2");
Response.Write(str);

#2


感谢cpp2017(幕白兄) 。

可是,我是想替换一个网页中不在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>之间可以有其它字符)

#7


(test(?=[^<>]*<a))|(</a>[^<>]*?test)

这样你试试,就是匹配<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);
}

#9


j9988(j9988) 的(test(?=[^<>]*<a))|(</a>[^<>]*?test)在某些情况下可以使用,
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>");

#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));

另外,如果这里的正则表达式一定要是全局替换的,才能一次替换多个。

#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;
}

#14


cuixiping(无心) 的好,学习……

#15


呵呵,我认为我的更符合楼主的要求。

#16


cuixiping(无心) 的不行
没有考虑周全,我用正则表达式测试工具测试出了

当<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;
}

#18


to winner2050(winner),
因为test不可能是标签呀,所以我的写法没有问题。
如果你不是test而是a,在表达式前面加上判断非<符号即可 /(?!<)a(?![^<]*<\/a>/g

#19


看了大家的讨论,再跟据楼主后几次发言中的需求.我想很难一次匹配替换.
我还是比较认同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;
}
/***********************************/
在我的需求中都可以使用。