从C#中的字符串获取域的第一部分?

从C#中的字符串获取域的第一部分?,c#,.net,C#,.net,我已经看过了,但是所有的解决方案都喜欢使用URI,当它不是必需的时候,我想在正则表达式中这样做,所以我写了我自己的文章,因为其他的文章是不同的 我想从url中提取用户名,假设我有如下url https://godisgod123.example.com/post/294912194919491 sunrises.example.com/profile/29491294919 http://imsorry.example.com/video/12932993113 我会得到 godisgod12

我已经看过了,但是所有的解决方案都喜欢使用URI,当它不是必需的时候,我想在正则表达式中这样做,所以我写了我自己的文章,因为其他的文章是不同的

我想从url中提取用户名,假设我有如下url

https://godisgod123.example.com/post/294912194919491
sunrises.example.com/profile/29491294919
http://imsorry.example.com/video/12932993113
我会得到

godisgod123
sunrises
imsorry
我已经试过什么了

return Regex.Match(address, @"^\w*\.\w*\.\w*").Value;

但是上面的代码不起作用,它返回一个空字符串。

正则表达式对此可能有点过头了-简单地使用
IndexOf
Substring
就可以了。事实上,几年来我一直在使用一种扩展方法来提取两个分隔符之间的子字符串:

public static string Substring(this string source, string fromDelimiter, string toDelimiter)
{
    var start = source.IndexOf(fromDelimiter);
    if (start == -1)
    {
        throw new ArgumentOutOfRangeException("fromDelimiter", fromDelimiter + " not found in " + source);
    }

    start += fromDelimiter.Length;
    var end = source.IndexOf(toDelimiter, start);

    if (end == -1)
    {
        throw new ArgumentOutOfRangeException("toDelimiter", toDelimiter + " not found in " + source + " after " + fromDelimiter);
    }

    return source.Substring(start, end - start);
}

\w
匹配所有单词字符,其中不包括
://
。您的正则表达式需要一个可选的单词字符序列,最多为一个文本
,但单词字符和
之间有一个
://
,这意味着第一个和第三个示例不匹配

您的第二个示例与完整域匹配,这更好,但仍然不是您想要的

为了满足特定示例的要求,可以使用简单的正则表达式,如下所示:

(\w+)\.
这与一组(
()
)单词字符(
\w
)相匹配,后跟一个。(
\。
)。为了只提取单词字符组(子域),您可以使用以下C代码访问该组:

注意以下几点:

  • 这里没有针对
    null
    的测试,因此您需要确保在没有匹配项的情况下处理该情况
  • 当存在多个子域时,这不起作用。例如,使用
    one.two.example.com
    ,它将只匹配
    one
    ,而不是
    one.two
  • 它也不适用于包含非单词字符的子域。e、 g.
    one-two.example.com
    将只匹配
    two
    ,而不是
    one-two

  • 这满足了您问题的要求,但至少出于我上面提到的原因,它不是很健壮。URI方法可能会更好地处理这个问题,但我觉得值得在此解释regex选项。

    所有答案都使用URI,我建议您在回答问题之前先阅读问题。可能的重复答案不仅使用URI类(原因),还使用专用NPM包、regex解决方案、,和一个扩展方法(扩展URI类,但可以作为独立方法实现)。此外,基于URI的答案可以挖掘出处理字符串的部分,因为所有这些部分都将主机转换为字符串,然后使用它。我认为这是一个重复的问题,因为我认为它要求的是相同的答案(只是没有URI类),但有一个原因,为什么需要多次投票才能结束一个问题。
    Regex.Match(address, @"(\w+)\.").Groups[1]