使用RegEx在字符串中的特定文本后查找数字

时间:2015-06-04 08:47:50

标签: regex string powershell string-matching powershell-v4.0

我有一个如下所示的多行字符串:

2012-15-08 07:04 Bla bla bla blup
2012-15-08 07:05 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:05 Another text that I don't want to search...
2012-15-08 07:06 Another text that I don't want to search...
2012-15-08 07:06 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:07 Import has finished bla bla

我想要的是在RegularExpression(使用PowerShell)的帮助下提取所有有错误的行号。所以我需要找到" ***错误导入行号之间的数字。 "和以下":"因为这总是会给我行号。

我查看了其他各种RegEx问题,但说实话,答案对我来说就像中文一样。

尝试在http://regexr.com/的帮助下建立了RegEx,但到目前为止还没有成功,例如使用以下模式:

"Error importing row no. "(.?)":"

任何提示?

3 个答案:

答案 0 :(得分:11)

试试这个表达式:

"Error importing row no\. (\d+):"

DEMO

在这里,您需要了解量词和转义序列:

  • .任何角色;如您只想要数字,请使用\d;如果你的意思是句号,你必须用反斜杠(\.
  • 来逃避它
  • ?零个或一个字符;这不是你想要的,因为你可以在这里找到第10行的错误,只需要“1”
  • +一个或多个;这对我们来说已足够了
  • *任何字符数;使用.*时必须小心,因为它可以消耗您的整个输入

答案 1 :(得分:1)

非常直接。现在你的引用会导致你写的正则表达式出错。试试这个:

$LogText = ""#Your logging stuff
[regex]$Regex = "Error importing row no\. ([0-9]*):"
$Matches = $Regex.Matches($LogText)
$Matches | ForEach-Object {
    $RowNum = $_.Groups[1].Value #(Waves hand) These are the rows you are looking for
}

答案 2 :(得分:0)

这可能有多种方式,下面显示的几个简单方法可能会有所帮助: -

我把你的日志记在一个名为temp.txt的文件中。

cat temp.txt | grep " Error importing row no." | awk -F":" '{print $2}' | awk -F"." '{print $2}'

OR

cat temp.txt | grep " Error importing row no." | sed  's/\(.*\)no.\(.*\):\(.*\)/\2/'