首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管柱端面

管柱端面
EN

Stack Overflow用户
提问于 2015-08-10 21:06:02
回答 3查看 2.4K关注 0票数 1

我很难在字符串的末尾剪掉一些字符。字符串通常如下所示:

代码语言:javascript
复制
C:\blah1\blah2

但有时它看起来像:

代码语言:javascript
复制
C:\blah1\blah2.extra

我要把字符串“blah2 2”拔掉。大多数情况下,使用子字符串命令很容易做到这一点。但是在罕见的情况下,当“.extra”部分出现时,我需要首先修剪掉这个部分。

问题是,'.extra‘总是以点开始,但后面跟着不同长度的字母组合。所以通配符是必要的。本质上,我需要脚本,“如果字符串包含一个点,修剪掉这个点和它后面的任何东西。”

$string.replace(".*","")不工作。$string.replace(".\*","")也不是。$string.replace(".[A-Z]","")也不是。

而且,我也不能从字符串的一开始就得到它。“blah1”是未知的,长度也不一样。我必须从字符串的末尾得到'blah2‘。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-10 21:14:19

假设字符串始终是具有扩展名或没有扩展名的文件的路径(例如".extra"),则可以使用Path.GetFileNameWithoutExtension()

代码语言:javascript
复制
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2")
blah2
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2.extra")
blah2

这条路甚至不一定要扎根:

代码语言:javascript
复制
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("blah1\blah2.extra")
blah2

如果您想自己实现类似的功能,这应该相当简单--使用String.LastIndexOf()查找字符串中的最后一个\,并使用它作为Substring()的起始参数。

代码语言:javascript
复制
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
}

你会看到类似的结果:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2015-08-10 22:05:53

正如其他海报所述,您可以为此使用特殊的文件名操纵器。如果你想用正则表达式来做,你可以说

$string.replace("\..*","")

\..*正则表达式匹配一个点(\.),然后匹配任何字符串(.*)。

让我单独谈谈每一个不工作的规则:

$string.replace(".*","")

原因是.*都是正则表达式中的特殊字符:.是与任何字符匹配的通配符,*的意思是“匹配以前的字符0次或更多次”。所以.*的意思是“任何字符串的字符。”

$string.replace(".\*","")

在本例中,您正在转义*字符,这意味着正则表达式按字面处理它,因此正则表达式匹配任何单个字符(.),后面是星星(\*)。

$string.replace(".[A-Z]","")

在这种情况下,正则表达式将匹配任何字符(.),后面是任何大写字母([A-Z])。

票数 1
EN

Stack Overflow用户

发布于 2015-08-10 21:20:44

如果字符串是使用Get-Item的实际路径,则另一个选项是:

代码语言:javascript
复制
$path = 'C:\blah1\blah2.something'
(Get-Item $path).BaseName

这里不能使用Replace()方法,因为它不支持通配符或正则表达式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31929168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档