我很难在字符串的末尾剪掉一些字符。字符串通常如下所示:
C:\blah1\blah2但有时它看起来像:
C:\blah1\blah2.extra我要把字符串“blah2 2”拔掉。大多数情况下,使用子字符串命令很容易做到这一点。但是在罕见的情况下,当“.extra”部分出现时,我需要首先修剪掉这个部分。
问题是,'.extra‘总是以点开始,但后面跟着不同长度的字母组合。所以通配符是必要的。本质上,我需要脚本,“如果字符串包含一个点,修剪掉这个点和它后面的任何东西。”
$string.replace(".*","")不工作。$string.replace(".\*","")也不是。$string.replace(".[A-Z]","")也不是。
而且,我也不能从字符串的一开始就得到它。“blah1”是未知的,长度也不一样。我必须从字符串的末尾得到'blah2‘。
发布于 2015-08-10 21:14:19
假设字符串始终是具有扩展名或没有扩展名的文件的路径(例如".extra"),则可以使用Path.GetFileNameWithoutExtension()
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2")
blah2
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2.extra")
blah2这条路甚至不一定要扎根:
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("blah1\blah2.extra")
blah2如果您想自己实现类似的功能,这应该相当简单--使用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
}你会看到类似的结果:
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发布于 2015-08-10 22:05:53
正如其他海报所述,您可以为此使用特殊的文件名操纵器。如果你想用正则表达式来做,你可以说
$string.replace("\..*","")
\..*正则表达式匹配一个点(\.),然后匹配任何字符串(.*)。
让我单独谈谈每一个不工作的规则:
$string.replace(".*","")
原因是.和*都是正则表达式中的特殊字符:.是与任何字符匹配的通配符,*的意思是“匹配以前的字符0次或更多次”。所以.*的意思是“任何字符串的字符。”
$string.replace(".\*","")
在本例中,您正在转义*字符,这意味着正则表达式按字面处理它,因此正则表达式匹配任何单个字符(.),后面是星星(\*)。
$string.replace(".[A-Z]","")
在这种情况下,正则表达式将匹配任何字符(.),后面是任何大写字母([A-Z])。
发布于 2015-08-10 21:20:44
如果字符串是使用Get-Item的实际路径,则另一个选项是:
$path = 'C:\blah1\blah2.something'
(Get-Item $path).BaseName这里不能使用Replace()方法,因为它不支持通配符或正则表达式。
https://stackoverflow.com/questions/31929168
复制相似问题