从C#中的行中提取GUID

时间:2017-05-30 14:23:54

标签: c#

我尝试使用IndexOf简化一些遗留代码,以从行中检索GUID。我可以进一步简化下面的代码,以摆脱使用guids.Any和guids.First?

<body>
<div class="container">
	<div class="buttonContainer"><center>
		<button class='button'><b>LOGIN</b></button>
		<button class='button button1' disabled>OR</button>
		<button class='button'><b>SIGNUP</b></button></center>
	</div>
</div>
</body>

在编译的示例中给出的遗留代码下面:

// Code using regular expression
private static string RetrieveGUID2(string[] lines)
{
    string guid = null;
    foreach (var line in lines)
    {
        var guids = Regex.Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?")
            .Cast<Match>().Select(m => m.Value);
        if (guids.Any())
        {
            guid = guids.First();
            break;
        }
    }
    return guid;
}

3 个答案:

答案 0 :(得分:4)

是的,你可以。因为您只返回正则表达式的第一个匹配项,您可以使用Regex.Match而不是Regex.Matches

private static string RetrieveGUID2(string[] lines)
{
    foreach (var line in lines)
    {
        var match = Regex.Match(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?");
        if (match.Success)
          return match.Value;
    }

    return null;
}

答案 1 :(得分:1)

使用foreach(var nextGuid in guids) { guid = nextGuid; break; } 循环,该循环在第一次迭代时突破 - 这实际上是FirstFirstOrDefault实现的方式

FirstOrDefault

进一步简化,您可以使用return Regex .Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?") .Cast<Match>() .Select(m => m.Value) .FirstOrDefault(); ,如果没有对象则不会抛出错误

import time
from gopigo import *  # Has the basic functions for controlling the GoPiGo Robot
import sys  # Used for closing the running program

now = time.time()
future = now + 0.500
while time.time() < future:
    bwd()  # Move backward
stop()  
sys.exit()

答案 2 :(得分:1)

只是使用Guid.TryParse()提供替代方案:

public static Guid? RetrieveGuid(IEnumerable<string> lines)
{
    Guid? parseGuid(string text) => Guid.TryParse(text, out Guid guid) ? (Guid?) guid : null;
    return lines.Select(parseGuid).FirstOrDefault(guid => guid != null);
}

或等效地:

public static Guid? RetrieveGuid(IEnumerable<string> lines)
{
    return lines.Select(line => Guid.TryParse(line, out Guid guid) ? (Guid?)guid : null)
        .FirstOrDefault(guid => guid != null);
}

这会返回Guid?而不是字符串,null的结果表示没有解析有效的Guid。