这是线条的样子:
//| Vegas.c |
我想得到这个名字,这里是Vegas.c
这适用于PS'正则表达式:
$found = $body -match '.+?\s+(\w.+?\.c[\+]+)[\s\|]+'
但是,如果名称不是以a-zA-Z0-9(= \ w)开头,而是例如〜或其他无字的字符?
名称的第一个字符必须与空格不同,所以我尝试了:
$found = $body -match '.+?\s+(\S+.+?\.c[\+]+)[\s\|]+'
$found = $body -match '.+?\s+([^\ ]+.+?\.c[\+]+)[\s\|]+'
$found = $body -match '.+?\s+([^\s]+.+?\.c[\+]+)[\s\|]+'
他们都没有工作甚至更多的工作。在大多数情况下,这仅检测整条线!
有什么想法吗?
答案 0 :(得分:1)
这个怎么样?
\/\/\| *([^ ]*)
\/
匹配字符/
\/
匹配字符/
\|
匹配字符|
*
匹配0到多个字符的人
圆括号
( )
是第一个捕获组
[^ ]
捕获^
(不是)空格的所有字符(只要所有文件名都不包含空格,这应该有效)
答案 1 :(得分:0)
我认为你提出的问题比你在评论中看到的更为基础,但是我的这个问题与你的测试字符串有关。
$string = @"
//| Vegas.c |
"@
只需在管道和空白管道边界之间查找数据。不知道它将如何与您的真实数据一起执行,但如果程序名称中有空格,则应该可以正常工作。
[void]($string -match "\|\s+(.+)\s+\|")
$Matches[1]
Vegas.c
您还可以在PowerShell中使用命名匹配
[void]($string -match "\|\s+(?<Program>.+)\s+\|")
$Matches.Program
Vegas.c