在C#中使用带斜杠(' /')的正则表达式解析guid

时间:2014-08-22 14:36:08

标签: c# regex guid

有没有办法解析像这样的正则表达式

"/string1/string2/f63112f7-caae-38f4-9655-e23d6b530315" 

我希望得到一个字符串:' f63112f7-caae-38f4-9655-e23d6b530315'

我尝试使用以下代码:

Match match2 = Regex.Match(input2, @"'/([^']*)");

或者这个:

Match match1 = Regex.Match(input1, 
@"/((?:(?:\s*\{*\s*(?:0x[\dA-F]+)\}*\,?)+)|(?<![a-f\d])[a-f\d]{32}(?![a-f\d])|" +
@"(?:\{\(|)(?<![A-F\d])[A-F\d]{8}(?:\-[A-F\d]{4}){3}\-[A-F\d]{12}(?![A-F\d])(?:\}|\)|))");

但遗憾的是我失败了。

有没有办法用返回的guid解析这样的字符串? 谢谢你。

6 个答案:

答案 0 :(得分:4)

您可以在没有正则表达式的情况下执行此操作,在/上拆分,然后使用Guid.TryParse最后一个元素,或所有元素,如:

string str = "/string1/string2/f63112f7-caae-38f4-9655-e23d6b530315";
Guid tempGuid;
foreach (var item in str.Split('/'))
{
    if (Guid.TryParse(item, out tempGuid))
    {
        Console.WriteLine(item);
        break;
    }
}

如果您总是希望字符串末尾有Guid,那么不要遍历所有元素,只需访问split数组中的最后一个元素并在Guid.TryParse中使用

if(Guid.TryParse(str.Split('/').LastOrDefault(), out tempGuid))
{
 //found Guid at the end of string
}

答案 1 :(得分:2)

您可以尝试使用以下正则表达式匹配最后一个/符号旁边的所有字符,

(?<=\/)[^\/]*$

DEMO

C#代码将是,

string str = @"/string1/string2/f63112f7-caae-38f4-9655-e23d6b530315";
string result = Regex.Match(str, @"(?<=\/)[^\/]*$").Value;
Console.WriteLine(result);
Console.ReadLine();

IDEONE

答案 2 :(得分:2)

如果您真的想使用正则表达式,这似乎适用于您的场景:

var match = Regex.Match(input, @"[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");

Guid guid;
if (!match.Success || !Guid.TryParse(match.Value, out guid))
{
    guid = Guid.Empty;
}

正如其他答案所暗示的那样,如果您的字符串始终采用预期格式,则可以采用更简单的方法。

答案 3 :(得分:1)

您不需要正则表达式,简单的LastIndexOf + Guid.TryParse无效:

string guidString = str.Substring(str.LastIndexOf('/') + 1);
Guid guid = Guid.TryParse(guidString, out guid) ? guid : Guid.Empty;

答案 4 :(得分:0)

使用SplitLast Guid有一个输入字符串的ctor。

string str = "/string1/string2/f63112f7-caae-38f4-9655-e23d6b530315";
Guid g = new Guid(str.Split('/').Last());

答案 5 :(得分:0)

您可以使用此正则表达式:

.*\/(.*)

<强> Working demo

enter image description here