用正则表达式做内容关键字链接

本文介绍了一个使用C#实现的函数,该函数能够为指定字符串中的关键词添加超链接,并确保每个关键词仅被处理一次。通过正则表达式匹配和替换,此方法能够智能地处理包含HTML标签的文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 private void rc()
    {
        string str1 = "<img src=\"sss.jpg\" alt=\"网络技术网络;网络应用\">网络技术网络;网络应用 网络基本知识 <img src=\"sss.jpg\" alt=\"网络技术网络;网络应用\"><a  href=\"http://www.stobar.cn/">网络技术网络;网络应用 网络基本知识</a>";

 List<string> keys = new List<string>();
        keys.Add("网络");
        keys.Add("网络技术");
        keys.Add("网络基本");
        string result = keyAddUrl(str1, keys,"http://www.baidu.com/");
        this.Label1.Text = result;

    }

    /// <summary>
    /// 给关键字加链接,同一关键字只加一次
    /// </summary>
    /// <param name="src">源字符串</param>
    /// <param name="keys">关键字泛型</param>
    /// <param name="keys">链接地址</param>
    /// <returns>替换后结果</returns>
    private string keyAddUrl(string src, List<string> keys ,string URL)
    {
        Regex reg = new Regex(@"(?i)(?:^|(?<!<a\b(?>[^<>]*))>)(?>[^<>]*)(?:<|$)");
        int length = 0;
        string temp = string.Empty;
        return reg.Replace(src, delegate(Match m)
        {
            temp = m.Value;
            length = temp.Length;
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                temp = Regex.Replace(temp, @"(?is)^((?:(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*<a\b(?:(?!</?a\b).)*</a>)*(?:(?!" + Regex.Escape(keys[i]) + @"|</?a\b).)*)(?<tag>" + Regex.Escape(keys[i]) + @")", @"$1<a href="+URL+" target=\"_blank\" title=\"${tag}\">${tag}</a>");
                if (length != temp.Length)
                {
                    keys.Remove(keys[i]);
                }
                length = temp.Length;
            }
            return temp;
        });
    }

 

转载于:https://www.cnblogs.com/dfsxh/archive/2010/07/21/1782073.html

参考资源链接:[编译原理实验 词法分析 自顶向下的语法分析程序 基于LR(0)方法的语法分析 语义分析和中间代码生成](https://wenku.youkuaiyun.com/doc/16jsvqb8fj?utm_source=wenku_answer2doc_content) 在编译器设计中,词法分析是一个关键步骤,它负责将源代码的字符序列分解成一个个有意义的词法单元(tokens)。关键字是语言预定义的保留字,具有特定的意义,通常在编译器中被特殊处理。利用正则表达式是识别关键字的常用方法,因为正则表达式能够准确匹配字符模式。 为了帮助你掌握如何使用正则表达式在编译器的词法分析器中识别关键字,推荐参考《编译原理实验 词法分析 自顶向下的语法分析程序 基于LR(0)方法的语法分析 语义分析和中间代码生成》一书中的相关实验部分,特别关注实验1中关于词法分析的内容。这本书详细描述了实验的目的、任务、内容以及程序的实现方式,非常适合初学者。 在实现时,你需要定义与关键字相对应的正则表达式模式。例如,假设我们有一个简单的语言,关键字包括 'int', 'if', 'else', 'return',那么相应的正则表达式模式可以是: ``` \b(int|if|else|return)\b ``` 这个模式利用了 `\b` 来确保匹配完整的单词边界,避免将关键字的一部分错误地匹配关键字。 接下来,你可以使用词法分析工具或库,如lex或其替代品,来实现这个正则表达式。以下是一个简单的代码示例,展示了如何在使用lex工具时实现对关键字匹配: ```lex %{ #include <stdio.h> %} %option nounput %% [ \t]+ { /* 忽略空白 */ } \n { return '\n'; } [a-zA-Z]+ { return 'ID'; } <int> { return 'INT'; } <if> { return 'IF'; } <else> { return 'ELSE'; } <return> { return 'RETURN'; } %% int main() { yylex(); return 0; } int yywrap() { return 1; } ``` 在这个示例中,我们定义了一些模式规则来匹配关键字和标识符。请注意,实际的正则表达式应根据你所使用的词法分析工具的语法规则进行调整。 通过本例的学习,你将能够掌握如何在编译器的词法分析阶段使用正则表达式来识别关键字,并理解其在编译过程中的重要性。为了进一步提升你在编译原理方面的知识,我建议继续阅读并实践《编译原理实验》中其他部分的内容,如自顶向下的语法分析程序、基于LR(0)方法的语法分析,以及语义分析和中间代码生成等。这些实验将帮助你构建一个完整的编译器前端,并对整个编译过程有更深入的了解。 参考资源链接:[编译原理实验 词法分析 自顶向下的语法分析程序 基于LR(0)方法的语法分析 语义分析和中间代码生成](https://wenku.youkuaiyun.com/doc/16jsvqb8fj?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值