求正则高手,正则匹配替换用户输入的内容

细嗅蔷薇 2015-08-14 03:34:40
由用户用富文本编辑器提交的一段字符串内容,我们根据一个关键字库中的关键字去匹配这段内容,匹配上了就替换一下内容
比如 匹配杭州,替换成 <a href="www.baidu.com">杭州</a> 这样。
但是因为字符串中会有很多html标签,所以像 a标签的href 、img标签的alt属性内容 也可能会匹配上。所以需要对这个做处理,只能匹配标签属性外部的文字内容。暂时还没想到其他的情况了。


案件发狂了经费卡拉安fasdfa快了3213剪短发了开始就废了卡上就快到了<img src="...." alr="杭州"/>房间爱哭了圣fasdfa诞21节法拉杭州克是对减肥了可接受的付款了空间大发了卡fadfaadf萨丁
上课了大卷发了开<a href="杭州">杭州</a>始叫对方了空间非空32121了数据房间放开了三季fasdf度飞1

求各位菊苣帮忙写几个正则匹配一下。
...全文
279 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
细嗅蔷薇 2015-08-19
  • 打赏
  • 举报
回复
引用 21 楼 starfd 的回复:
因为你这个是一个字符串内有多个匹配值,导致内部replace了,而不是外部 改成下面的那个再多一次正则匹配就可以了
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
html = @"杭州付款哈考几分a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
//int num = 0;
MatchEvaluator func = m =>
{
    //if (num > 0)
    //{
    //    return m.Value;
    //}
    //else
    //{
    //    num++;
    //return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
    return new Regex(m.Groups[1].Value).Replace(m.Value, "<a>" + m.Groups[1].Value + "</a>", 1);
    //}
};
//Console.WriteLine(Regex.Replace(html, patten, func));

Regex regex = new Regex(patten);
Console.WriteLine(regex.Replace(html, func, 1));
谢谢你这么耐心。
  • 打赏
  • 举报
回复
因为你这个是一个字符串内有多个匹配值,导致内部replace了,而不是外部 改成下面的那个再多一次正则匹配就可以了
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
html = @"杭州付款哈考几分a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
//int num = 0;
MatchEvaluator func = m =>
{
    //if (num > 0)
    //{
    //    return m.Value;
    //}
    //else
    //{
    //    num++;
    //return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
    return new Regex(m.Groups[1].Value).Replace(m.Value, "<a>" + m.Groups[1].Value + "</a>", 1);
    //}
};
//Console.WriteLine(Regex.Replace(html, patten, func));

Regex regex = new Regex(patten);
Console.WriteLine(regex.Replace(html, func, 1));
细嗅蔷薇 2015-08-18
  • 打赏
  • 举报
回复
引用 18 楼 starfd 的回复:
第一个是不能的,因为被注销了相关代码,第二个是可以的
抱歉,是我的问题。 我直接拿我的内容试的,发现不对。 这样: 杭州付款哈考几分a法律框架非空杭州1321 不包含标签的时候就都替换了,你看能不能帮我改改。
WM_JAWIN 2015-08-18
  • 打赏
  • 举报
回复
处理这种数据,一两行,正则是搞不定的。第一步,你要先识别html的标签,第二步,才能进行替换
  • 打赏
  • 举报
回复
第一个是不能的,因为被注销了相关代码,第二个是可以的
  • 打赏
  • 举报
回复
这么工整的代码怎么可能没试过……
细嗅蔷薇 2015-08-18
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
//int num = 0;
MatchEvaluator func = m =>
{
    //if (num > 0)
    //{
    //    return m.Value;
    //}
    //else
    //{
    //    num++;
        return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
    //}
};
Console.WriteLine(Regex.Replace(html, patten, func));

Regex regex = new Regex(patten);
Console.WriteLine(regex.Replace(html, func, 1));
不知道你有没有试过,但是并不能。 还是很感谢你。
  • 打赏
  • 举报
回复
哎,不要用静态方法,用 Regex re = new Regex(patten); re.Replace这个方法可以指定几次的
细嗅蔷薇 2015-08-17
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
Console.WriteLine(Regex.Replace(html, patten, m =>
{
    return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
}));
a标签内的不会被匹配了
return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
这个就直接把符合条件字符一次全部替换了。怎么计数?
  • 打赏
  • 举报
回复
你在外面设个局部变量 num,然后判断计数不就可以了
细嗅蔷薇 2015-08-17
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
Console.WriteLine(Regex.Replace(html, patten, m =>
{
    return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
}));
a标签内的不会被匹配了
能不能只替换一次?
  • 打赏
  • 举报
回复
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
//int num = 0;
MatchEvaluator func = m =>
{
    //if (num > 0)
    //{
    //    return m.Value;
    //}
    //else
    //{
    //    num++;
        return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
    //}
};
Console.WriteLine(Regex.Replace(html, patten, func));

Regex regex = new Regex(patten);
Console.WriteLine(regex.Replace(html, func, 1));
  • 打赏
  • 举报
回复
int num=0;
Console.WriteLine(Regex.Replace(html, patten, m =>
{
    if(num>=1)
    {return m.Value,
     }else{
    return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");}
}));
那你这样试下吧
细嗅蔷薇 2015-08-17
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
哎,不要用静态方法,用 Regex re = new Regex(patten); re.Replace这个方法可以指定几次的
但是这样替换后的内容不对额。
  • 打赏
  • 举报
回复
string html = @"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten = @"(?:^|>)[^><]*?(杭州)[^><]*?(?:<(?!/a\b)|$)";
Console.WriteLine(Regex.Replace(html, patten, m =>
{
    return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
}));
a标签内的不会被匹配了
细嗅蔷薇 2015-08-14
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
string html=@"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten=@"(?:^|>)[^><]*?(杭州)[^><]*?(?:<|$)";
Console.WriteLine(Regex.Replace(html, patten, m =>
{
return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
}));
我刚测了一下你给的这个,也会匹配到a标签内的内容噶 可能我的说法有误,我的意思是不需要匹配 分<a href=""www.baidu.com/杭州"">杭州</a>a法 a标签内的内容。
  • 打赏
  • 举报
回复
string html=@"杭州付款哈考几分<a href=""www.baidu.com/杭州"">杭州</a>a法律框架非空杭州1321";
string patten=@"(?:^|>)[^><]*?(杭州)[^><]*?(?:<|$)";
Console.WriteLine(Regex.Replace(html, patten, m =>
{
return m.Value.Replace(m.Groups[1].Value, "<a>" + m.Groups[1].Value + "</a>");
}));
  • 打赏
  • 举报
回复
>[^><]*?(杭州)[^><]*?<
替换Group1
细嗅蔷薇 2015-08-14
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
(?<!=["'])杭州
这个有点问题 比如字串是这样的:付款哈考几分<a href="www.baidu.com">杭州</a>a法律框架非空。 就不行。需要考虑a标签内部的的内容
q107770540 2015-08-14
  • 打赏
  • 举报
回复
(?<!=["'])杭州

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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