1

所以我需要做的是匹配文本,直到我击中某个字符,然后停止。现在我有一段时间让它正常工作,在这一点上,我想我只是让自己更加困惑。我正在搜索的文本将如下所示:

ServerA_logfile.log
ServerB_logfile.log
ServerC_logfile.log

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

这是我的代码:

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

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

我错过了什么?

4

3 回答 3

6

你需要的是积极的前瞻(它是在某些情况下为匹配量身定制的)

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

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

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

  • 在行首 ( ^)
  • 任意长度的字符串(大于或等于一个字符) ( .+)
  • 后跟下划线 ( (?=_)),表示正向前瞻
于 2012-09-13T16:21:21.877 回答
3

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

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

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

于 2012-09-13T17:07:21.887 回答
2

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

这是代码:

Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { $_.Split("_")[0] }
于 2012-09-13T17:02:13.443 回答