PowerShell与字符串

问题描述:

删除文本我有一个字符串PowerShell与字符串

[Test: ABC.Test (6)] MORETEXTGOESHERE [(null)] <(null)> - A red fox jumped the fence

,并想修剪字符串,只显示

A red fox jumped the fence

什么是去了解它的最佳方式。我相信我会用SubStrings和IndexOfs来管理,但也许有一些正则表达式可以做到这一点。

使用子串,你可以这样做:

PS> $str = '[Test: ABC.Test (6)] MORETEXTGOESHERE [(null)] <(null)> - ' +` 
      'A red fox jumped the fence' 
PS> $str.Substring($str.LastIndexOf('-')+2) 
A red fox jumped the fence 

那如果处理不-字符线有点脆。这里,将工作正则表达式:

PS> $str | Select-String '-\s*([^-]*)$' | Foreach{$_.Matches[0].Groups[1].Value} 
A red fox jumped the fence 

如果通过线加工生产线,我喜欢这种方法:

PS> if ($str -match '-\s*([^-]*)$') { $matches[1] } 
A red fox jumped the fence 

并与更现实的字符串:

PS> $str = '2010-09-09 07:15:31,749 [ABC: TEST.TEST (3)] ABB MYCLASS.TEST ' +` 
      '[(null)] <(null)> - MessageId: ' +` 
      '46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED' 
PS> if ($str -match '- MessageId:\s*(.*)$') { $matches[1] } 
46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED 

,或者如果您不想在输出中创建:

PS> if ($str -match '- MessageId:\s*(.*?)\s+CREATED\s*$') { $matches[1] } 
46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 
+0

嗯..也许我没有画完整的图片,对不起。 – Henno 2010-09-09 02:57:20

+0

这里有一个更真实的例子 2010-09-09 07:15:31,749 [ABC:TEST.TEST(3)] ABB MYCLASS.TEST [(null)] - MessageId:46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED – Henno 2010-09-09 02:57:38

+0

你想从MessageId中提取所有内容吗?或者你想省略'CREATED'吗? – 2010-09-09 04:17:08

如果你的字符串有固定的模式......即,你感兴趣的文本总是在<(null)>之后,并且在文本中没有“>”,那么如何分割“>”上的输入行并返回数组的第二个元素。