gpt4 book ai didi

c# - 正则表达式替换 - 忽略链接中的内容

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:19 24 4
gpt4 key购买 nike

我有一个简单的字符串替换,它查找特定的单词并替换为其他内容。
即,如果我有一个键 - bla 和值 - boo,下面将产生

 var input ="bla bla test test1 test3...";

foreach (var obj in dictionary)
{
inputText = Regex.Replace(inputText, obj.Key, obj.Value);
}

var output = "boo boo test test1 test3...";

现在我有 html 作为输入,现在可以输入

“bla bla test test1 test3。转到 www.something.com/bla/something” 结果为

“boo boo test test1 test3。转到 www.something.com/boo/something”

(此内容显示在 html 浏览器中)

这里我想跳过 url 中的替换,所以它只会替换所有内容,但不替换 url。有可能吗

最佳答案

是的,您可以匹配一个看起来像 URL 的子字符串并保留该文本,否则执行替换。

代码看起来像

inputText = Regex.Replace(inputText, $@"\b(https?://\S+|www\.\S+)|{Regex.Escape(obj.Key)}", m =>
m.Groups[1].Success ? m.Groups[1].Value : obj.Value);

请注意,我使用 Regex.Escapeobj.Key 中的潜在特殊字符转义为 Regex.Escape(obj.Key) .

\b(https?://\S+|www\.) 匹配整个单词(因为 \b 是单词边界) http https 然后是 :// 和 1+ 个非空白字符或 www. 和 1+ 个非空白字符。因此,如果正则表达式匹配一个 URL,它将被放入 m.Groups[1] 并在匹配评估器中,替换将是相同的 URL 文本,否则,obj。值 将用作替换文本。

不过,这种方法可能还有另一个问题,即替换相同的文本两次或多次。然后,您需要根据您的字典键创建一个带有交替的正则表达式,然后使用匹配评估器根据键匹配获得正确的值。

所以,我会推荐类似的东西

var dct = new Dictionary<string, string>();
dct.Add("bla", "boo");
dct.Add("bla test", "ZZZ");
var pat = $@"\b(https://\S+|www\.\S+)|(?:{string.Join("|",dct.Keys.Select(k => Regex.Escape(k)).OrderByDescending(x => x.Length))})";
// Console.WriteLine(pat); => \b(https://\S+|www\.\S+)|(?:bla\ test|bla)
var input ="bla bla test test1 test3. Go to www.something.com/bla/something";
var output = Regex.Replace(input, pat, m => m.Groups[1].Success ? m.Groups[1].Value : dct[m.Value]);
Console.Write(output);
// => boo ZZZ test1 test3. Go to www.something.com/bla/something

参见 C# demo .

关于c# - 正则表达式替换 - 忽略链接中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44758362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com