如何使用PowerShell提取子字符串?
我有这个字符串......
"-----start-------Hello World------end-------"
我必须提取......
Hello World
最好的方法是什么?
答案 0 :(得分:39)
-match
运算符测试正则表达式,将其与魔术变量$matches
合并以获得结果
PS C:\> $x = "----start----Hello World----end----"
PS C:\> $x -match "----start----(?<content>.*)----end----"
True
PS C:\> $matches['content']
Hello World
每当对正则表达式有疑问时,请查看此网站:http://www.regular-expressions.info
答案 1 :(得分:33)
Substring
方法为我们提供了一种根据起始位置和长度从原始字符串中提取特定字符串的方法。如果只提供一个参数,则将其作为起始位置,并输出字符串的其余部分。
PS > "test_string".Substring(0,4)
Test
PS > "test_string".Substring(4)
_stringPS >
但这更容易......
$s = 'Hello World is in here Hello World!'
$p = 'Hello World'
$s -match $p
最后,通过一个只选择.txt文件并搜索“Hello World”出现的目录:
dir -rec -filter *.txt | Select-String 'Hello World'
答案 2 :(得分:10)
不确定这是否有效,但PowerShell中的字符串可以使用数组索引语法引用,与Python类似。
完全直观,因为index = 0
引用了第一个字母,但确实如此:
以下是一些例子:
PS > 'Hello World'[0..2]
产生结果(为清晰起见,包括索引值 - 未在输出中生成):
H [0]
e [1]
l [2]
传递-join ''
:
PS > 'Hello World'[0..2] -join ''
Hel
使用不同的索引可以获得一些有趣的效果:
<强>转发强>
使用小于第二个的第一个索引值,并且将按照您的预期在前进方向中提取子字符串。这次第二个索引值远远超过字符串长度,但没有错误:
PS > 'Hello World'[3..300] -join ''
lo World
不像:
PS > 'Hello World'.Substring(3,300)
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within
the string.
<强>向后强>
如果您提供的第二个索引值低于第一个索引值,则反向返回该字符串:
PS > 'Hello World'[4..0] -join ''
olleH
从结束
如果您使用负数,则可以从字符串的末尾引用位置。要提取'World'
,最后5个字母,我们使用:
PS > 'Hello World'[-5..-1] -join ''
World
答案 3 :(得分:5)
PS> $a = "-----start-------Hello World------end-------" PS> $a.substring(17, 11) or PS> $a.Substring($a.IndexOf('H'), 11)
$a.Substring(argument1, argument2)
- &gt;这里argument1
=所需字母的起始位置,argument2
=您想要输出的子字符串的长度。
这里17是字母'H'
的索引,因为我们要打印到Hello World,我们提供11作为第二个参数
答案 4 :(得分:3)
根据Matt的回答,这是一个搜索换行符并且易于修改以供自己使用的
$String="----start----`nHello World`n----end----"
$SearchStart="----start----`n" #Will not be included in results
$SearchEnd="`n----end----" #Will not be included in results
$String -match "(?s)$SearchStart(?<content>.*)$SearchEnd"
$result=$matches['content']
$result
-
注意:如果要对文件运行此操作,请记住Get-Content返回的数组不是单个字符串。您可以通过执行以下操作来解决此问题:
$String=[string]::join("`n", (Get-Content $Filename))
答案 5 :(得分:3)
其他解决方案
$template="-----start-------{Value:This is a test 123}------end-------"
$text="-----start-------Hello World------end-------"
$text | ConvertFrom-String -TemplateContent $template
答案 6 :(得分:0)
我需要在日志文件中提取几行,而这篇文章对解决我的问题很有帮助,因此我想在此处添加它。如果有人需要提取多行,则可以使用脚本获取与该字符串匹配的单词的索引(我正在搜索“根”)并提取所有行中的内容。
$File_content = Get-Content "Path of the text file"
$result = @()
foreach ($val in $File_content){
$Index_No = $val.IndexOf("Root")
$result += $val.substring($Index_No)
}
$result | Select-Object -Unique
干杯..!
答案 7 :(得分:-2)
由于字符串不复杂,因此无需添加RegEx字符串。一个简单的匹配就可以解决问题
$line = "----start----Hello World----end----"
$line -match "Hello World"
$matches[0]
Hello World
$result = $matches[0]
$result
Hello World