我目前正在尝试从字符串中提取值并构建包含这些值的 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 替换每个组。限制是,我不知道input
、pattern
、replacement
或output
。 pattern
和 replacement
是两个配置值,我不想让它成为 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+)
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/