所以我需要做的是匹配文字,直到我碰到某个角色,然后停下来。现在我正好想让它正常工作,此时我觉得我只是让自己更加困惑。我正在搜索的文字将如下所示:
ServerA_logfile.log
ServerB_logfile.log
ServerC_logfile.log
我需要做的只是返回服务器名称,并排除下划线字符后的所有内容。
这是我的代码:
Get-ChildItem \\fileshare\logs\ -Name -Filter *.log | foreach { [regex]::match($_ -replace "^_", "")}
它返回的是......好吧,没有帮助,但那是我能得到的好。
我错过了什么?
答案 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
[^_]
匹配除下划线以外的任何字符。因此^[^_]*
在字符串的开头开始匹配,并在第一个下划线之前停止。