c# - 使用正则表达式提取组并在一行中构建 URL

标签 c# regex url

我目前正在尝试从字符串中提取值并构建包含这些值的 URL。我经历了十几个正则表达式问题,但我对答案不太满意。

我有包含多个信息的自定义编码字符串,我想构建一个包含这些信息的新 URL。

例如 35afe06d-8393-4559-b6d7-74d35ce131d8|Master 应该变成 http://my-server/media/guid/35afe06d-8393-4559-b6d7-74d35ce131d8? v=大师。我的第一个假设是

var input = "35afe06d-8393-4559-b6d7-74d35ce131d8|Master"
var pattern = @"((?:[a-f0-9]+-?){5})|(\w+)"
var replacement = "http://my-server/media/guid/$1?v=$2"
var output = Regex.Replace(input, pattern, replacement)

然而,这会用完整的 URL 替换每个组。限制是,我不知道inputpatternreplacementoutputpatternreplacement 是两个配置值,我不想让它成为 x 对配置值,input 来自应用程序并且可以有任何自定义编码(管道,冒号,...) output 取决于用例。它可以在模式中包含任意数量的组,最后甚至不必是 URL。

我可以想出不同的方法来做到这一点,比如自己解析字符串,或者尝试创建替换字典,或者使用正则表达式查找组,然后将字符串替换为 $1 => 匹配.组[0]。我只是觉得在 .NET 中必须有一个明显的单行解决方案,因为我什至记得在 PHP 中这样做过。

回答:这不是 .NET 限制,它只是未转义的管道。

最佳答案

在您的模式 (([a-f0-9]+-?){5})|\w+ 中,第二组应该在管道之后捕获单词字符(将管道转义为按字面匹配)。

如果您重复此部分 ([a-f0-9]+-?) 5 次,匹配也可以以连字符结束。

要匹配由破折号分隔的值,您可以匹配字符类 [a-f0-9]+ 并重复匹配 {4} 前缀的时间一个-

([a-f0-9]+(?:-[a-f0-9]+){4})\|(\w+)

.NET Regex demo | C# demo

enter image description here

var input = "35afe06d-8393-4559-b6d7-74d35ce131d8|Master";
var pattern = @"([a-f0-9]+(?:-[a-f0-9]+){4})\|(\w+)";
var replacement = "http://my-server/media/guid/$1?v=$2";
var output = Regex.Replace(input, pattern, replacement);
Console.WriteLine(output);

结果

http://my-server/media/guid/35afe06d-8393-4559-b6d7-74d35ce131d8?v=Master

关于c# - 使用正则表达式提取组并在一行中构建 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079675/

相关文章:

正则表达式根据文件扩展名列表获取文件名

python - 给定一个字符串列表,如何使用正则表达式找到第一个字符串匹配子字符串的位置?

javascript - JSLint "JavaScript URL."错误

PHP,读取通过 cURL 发送的 XML 文件

c# - 在 C# 中从 DLL 生成自定义事件

c# - 根据类型选择数据模板

c# - 休眠 + QueryOver : filter with Where ignoring sensitive

regex - 在正则表达式中使用交替时 Perl 未初始化值

java - java读取utf-8 url到字符串

c# - 基本的 while 循环 c#