Powershell正则表达式 - 匹配直到角色

时间:2012-09-13 16:03:23

标签: regex powershell

所以我需要做的是匹配文字,直到我碰到某个角色,然后停下来。现在我正好想让它正常工作,此时我觉得我只是让自己更加困惑。我正在搜索的文字将如下所示:

ServerA_logfile.log
ServerB_logfile.log
ServerC_logfile.log

我需要做的只是返回服务器名称,并排除下划线字符后的所有内容。

这是我的代码:

Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { [regex]::match($_ -replace "^_", "")}

它返回的是......好吧,没有帮助,但那是我能得到的好。

我错过了什么?

3 个答案:

答案 0 :(得分:5)

您需要的是positive lookahead(它是根据匹配之前的匹配而定制的)

[Regex]::Match($_, "^.+(?=_)").Value

Match()不返回字符串,而是返回Match个对象。因此,应该访问Value属性以从对象中提取字符串。

如果不清楚,使用的表达式指定查找:

  • 在行(^
  • 的开头
  • 任何长度的字符串(长于或等于一个字符)(.+
  • 后跟下划线((?=_)),这是正向前瞻

答案 1 :(得分:2)

我知道正则表达式是被请求的,但使用内置的split命令同样容易(也许更容易)。

以下是代码:

Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { $_.Split("_")[0] }

答案 2 :(得分:2)

还有另一个非常简单的解决方案:

[Regex]::Match($_, "^[^_]*").Value

[^_]匹配除下划线以外的任何字符。因此^[^_]*在字符串的开头开始匹配,并在第一个下划线之前停止。