如何查找字符的第3个和第4个实例之间出现的字符串

时间:2016-07-17 09:20:50

标签: regex powershell

我认为我需要的是一个表达式来排除字符的第3和第4个实例之外的任何内容,在这种情况下是反斜杠。听起来不错吗?

我试图解决的问题是如何从PowerShell中的给定UNC路径获取ShareName。

查找:" Share01"在示例源字符串中:

\\FQDN\Share01\Directories\...\...\...\...

PowerShell的Split-Path在这方面被证明有点受限,RegEx很难!

4 个答案:

答案 0 :(得分:9)

我这次聚会真的很晚,但我会建议一个替代方案:使用[Uri]类型:

$unc = '\\FQDN\Share01\Directories\...\...\...\...'
$upath = [Uri]$unc

测试路径是否确实是UNC路径:

$upath.IsUnc

获取分享

$upath.Segments[1]            # Returns Share01/
$upath.Segments[1].Trim('/')  # Trims the trailing /

或一个没有逃脱或修剪的衬垫:

[System.IO.Path]::GetPathRoot($unc).Split('\')[-1]

答案 1 :(得分:8)

在简单的场景中,我会使用类似于@Avshalom建议的方法,但使用String.Split()方法而不是-split运算符来避免使用正则表达式。

$unc = '\\FQDN\Share01\Directories\...\...\...\...'

$sharename = $unc.Split('\')[3]

如果您想要安全起见,首先应该规范路径分隔符,因为PowerShell接受/\作为路径中的分隔符:

$sharename = $unc.Replace('/', '\').Split('\')[3]

如果你想玩它真的很安全,可能没有办法解决正则表达式问题,因为有很多事情要处理:

  • 确保路径实际上是UNC路径(即以双斜杠/反斜杠开头,并且至少具有服务器和共享组件)。
  • 处理\/
  • 处理连续路径分隔符(.//some\\\folder/\path是PowerShell中的有效路径规范)。

要处理所有这些,您可以执行以下操作:

$unc = '\\FQDN\Share01\Directories\...\...\...\...'
$re  = '^[\\/]{2}[^\\/]+[\\/]+([^\\/]+)'

if ($unc -match $re) {
  $sharename = $matches[1]
} else {
  "Not a valid UNC path: $unc"
}

正则表达式细分:

  • ^[\\/]{2}匹配字符串开头的两个连续斜杠或反斜杠。
  • [^\\/]+匹配一个或多个既不是斜杠也不反斜杠的字符序列(即路径组件)。
  • [\\/]+匹配连续路径分隔符。
  • (...)将子匹配(在本例中为共享名称)分组,以便可以对其进行反向引用,例如通过automatic variable $matches

答案 2 :(得分:4)

另一种选择:

('\\FQDN\Share01\Directories\...\...\...\...' -split '\\' | ? {$_} )[1]

答案 3 :(得分:0)

为您的搜索修改此代码:

 $value="\\FQDN\Share01\Directories\...\...\...\..."
 $valuetosearch="Share01"
 $listresult=$value -split "\\"
 $counter = 0
 $listresult | select @{Name="Value";Expression={$_}}, @{Name="Rang";Expression={$global:counter; $global:counter++}} | where { $_.Rang -eq 3 -and $_.Value -eq $valuetosearch}