2012-06-04 26 views
0

我是新來的正則表達式,請在我需要使用正則表達式匹配兩個錯誤消息(出現在不同的行,但同一段落)和從日誌文件條件:在AND條件下匹配兩個字符串的正則表達式

Msg1 - ERROR [com.company.util.ejb.TimedBean]() FAILED processing Loader

Msg2 - java.lang.RuntimeException: Message code:[SL] is unknown.

基本上,我需要的是匹配(msg1)&&(msg2),在這種情況下,(錯誤...裝載機)將出現在第一行(Java ...未知)將在下一行中進行。消息將始終遵循此順序。我不是用任何典型的語言編程,而是將它們放入一個接受regexp的企業工具中。

如果可能,你是否也會告訴我如何使它成爲(msg1)||(msg2)

+0

目前還不清楚你想達到什麼目標......你能解釋一下betteR嗎? – aleroot

回答

1

從理論上講,匹配兩條連續的線只是將兩個正則表達式端到端放在一起的問題。因此,爲了說明的目的,假設您有一個名爲logfile.txt的文件,其中包含您正在查找的消息。然後從Linux命令行,你可以做這樣的事情:

pcregrep -M -o '^ERROR\N*Loader$\njava\N*unknown\.$\n' logfile.txt 

它會打印你要找的行對。將其分解爲若干部分:

  • ^ERROR匹配行開始處的單詞ERROR。
  • \N*匹配任何不是行結束符的字符數。
  • Loader$匹配行結束處的單詞Loader。
  • \n與換行符匹配。 (在Windows上可能不同。)
  • java\N*unknown\.$\n更是如此。

但是......這是一個大問題......處理您的正則表達式的工具必須能夠進行多行匹配,並且必須打開該功能。 (這就是-M命令行選項到pcregrep啓用的功能。)許多正則表達式工具(例如許多系統上的普通grep)不能執行多行搜索。所以你可能會走運。

+0

謝謝csd。我不知道爲什麼,但「\ N」在我的工具中不起作用(也許我沒有把它放在正確的方式)。我能夠啓用多行匹配功能。我使用的最後一個正則表達式是'/(ERROR。* \ n)。+(java \ .lang \ .RuntimeException \:Message code \:\ [SL \] is unknown。* \ n)/ i''' doesn'看起來和你一樣高效,但對我很有用! – Madean

+0

嗯...這是一個更好的:'/ERROR.+java \ .lang \ .RuntimeException \:消息代碼\:\ [SL \]是未知的/ s' – Madean

+0

如果不支持'\ N',你可以把它寫成'[^ \ n]'(即不是'\ n'的字符類)。你可能想這樣做的原因(而不是僅僅使用'。+')是因爲你不想讓你的正則表達式從文件的頂部到最後一個匹配。 – csd