修剪字符串的结尾

Jam*_*own 1 regex string powershell

我无法修剪字符串末尾的某些字符.字符串通常如下所示:

C:\blah1\blah2
Run Code Online (Sandbox Code Playgroud)

但有时它看起来像:

C:\blah1\blah2.extra
Run Code Online (Sandbox Code Playgroud)

我需要提取字符串'blah2'.大多数情况下,使用substring命令很容易.但是在极少数情况下,当存在'.extra'部分时,我需要首先修剪该部分.

问题是,'.extra'总是以点开头,然后是各种长度的字母的各种组合.所以通配符是必要的.本质上,我需要编写脚本,"如果字符串包含一个点,则修剪点和后面的任何内容."

$string.replace(".*","")不起作用.也没有$string.replace(".\*","").也没有$string.replace(".[A-Z]","").

此外,我无法从字符串的开头得到它.'blah1'未知且长度各异.我必须从字符串的末尾开始'blah2'.

Mat*_*sen 5

假设字符串始终是包含或不包含扩展名的文件的路径(例如".extra"),您可以使用 Path.GetFileNameWithoutExtension():

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2")
blah2
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2.extra")
blah2
Run Code Online (Sandbox Code Playgroud)

该路径甚至不必植根:

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("blah1\blah2.extra")
blah2
Run Code Online (Sandbox Code Playgroud)

如果你想自己实现类似的功能,那应该也很简单 - 用于String.LastIndexOf()查找字符串中的最后一个 \并将其用作你的起始参数Substring():

function Extract-Name {
    param($NameString)

    # Extract part after the last occurrence of \
    if($NameString -like '*\*') {
        $NameString = $NameString.Substring($NameString.LastIndexOf('\') + 1)
    }

    # Remove anything after a potential .
    if($NameString -like '*.*') {
        $NameString.Remove($NameString.IndexOf("."))
    }

    $NameString
}
Run Code Online (Sandbox Code Playgroud)

你会看到类似的结果:

PS C:\> Extract-Name "C:\blah1\blah2.extra"
blah2
PS C:\> Extract-Name "C:\blah124323\blah2.extra"
blah2
PS C:\> Extract-Name "C:\blah124323\blah2"
blah2
PS C:\> Extract-Name "abc124323\blah2"
blah2
Run Code Online (Sandbox Code Playgroud)