[英]Extract groups with regex and construct URL in a single line
我目前正在尝试从字符串中提取值并构建一个包含这些值的 URL。 我经历了十几个正则表达式问题,但我对答案不太满意。
我有包含多个信息的自定义编码字符串,我想构建一个包含这些信息的新 URL。
例如35afe06d-8393-4559-b6d7-74d35ce131d8|Master
应该变成http://my-server/media/guid/35afe06d-8393-4559-b6d7-74d35ce131d8?v=Master
。 我的第一个假设是
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
=> match.Groups[0]。 我只是觉得 .NET 中必须有一个明显的 1-liner 解决方案,因为我什至记得在 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
这个表达式也可能在这里工作:
^(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b)\s*\|\s*(.*?)\s*$
如果您希望探索/简化/修改它,则该表达式在此演示的右上角面板中进行了说明。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"^(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b)\s*\|\s*(.*?)\s*$";
string substitution = @"http://my-server/media/guid/\1?v=$2";
string input = @"35afe06d-8393-4559-b6d7-74d35ce131d8|Master
35afe06d-8393-4559-b6d7-74d35ce131d8| Master ";
RegexOptions options = RegexOptions.Multiline;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(input, substitution);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.