正则表达式,从一开始到一个特定字符的第三个url的url子串

时间:2015-07-22 19:54:05

标签: regex powershell substring

好的,我有一系列的网址,如

http://www.test.com/sasa
http://www.test.com/sasdassasdssda
http://www.test.com/ewewewewsasa
http://www.test.com

我想要做的只是从每个网址的子字符串开始,从开头到第三个/如果没有第三个/取原始字符串

基本上我想知道如何获得第三个/的位置,因为我假设如果没有第三个/那么它将是-1所以我可以抓住位置并且如果它不是-1则执行子串位。 无论如何,我在漫无边际。如何找到第三个斜线的位置?

1 个答案:

答案 0 :(得分:2)

听起来你想要没有路径的URI(第三个/之后的段)和尾随/本身。

最简单的方法是将字符串转换为实际的URI对象,然后使用AbsoluteUriPathAndQuery属性来计算切口的位置:

function Get-UriSchemeAndAuthority
{
    param(
        [string]$InputString
    )

    $Uri = $InputString -as [uri]
    if($Uri){
        $FullUri = $Uri.AbsoluteUri
        $Path = $Uri.PathAndQuery

        $SlashIndex = $FullUri.Length - $Path.Length

        return $FullUri.Substring(0,$SlashIndex)
    } else {
        throw "Malformed URI"
    }
}

适用于所有测试用例:

PS C:\> Get-UriSchemeAndAuthority http://www.test.com/sasa
http://www.test.com
PS C:\> Get-UriSchemeAndAuthority http://www.test.com/sasdassasdssda
http://www.test.com
PS C:\> Get-UriSchemeAndAuthority http://www.test.com/ewewewewsasa
http://www.test.com
PS C:\> Get-UriSchemeAndAuthority http://www.test.com
http://www.test.com

或者,取SchemeAuthority属性并从中创建一个新字符串(使其更简洁):

function Get-UriSchemeAndAuthority
{
    param(
        [string]$InputString
    )

    $Uri = $InputString -as [uri]
    if($Uri){
        return $("{0}://{1}" -f $Uri.Scheme,$Uri.Authority)
    } else {
        throw "Malformed URI"
    }
}