程序名称检测

时间:2014-11-20 15:37:08

标签: regex powershell

这是线条的样子:

  //|                                                        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\|]+'

他们都没有工作甚至更多的工作。在大多数情况下,这仅检测整条线!

有什么想法吗?

2 个答案:

答案 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