繁体   English   中英

使用正则表达式提取组并在一行中构造 URL

[英]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。 限制是,我不知道inputpatternreplacementoutput patternreplacement是两个配置值,我不想让它成为 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+)

.NET 正则表达式演示| C# 演示

在此处输入图片说明

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);
    }
}

参考

使用正则表达式在文本中搜索 UUID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM