簡體   English   中英

使用RegEx匹配任意長度和字符的子字符串

[英]Matching a substring of any length and characters using RegEx

我希望能夠匹配,然后在C#中使用regex提取以下字符串中的所有子字符串:

"2012-05-15 00:49:02 192.168.100.10 POST /Microsoft-Server-ActiveSync/default.eas User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_ 443 redcloud\nikced 94.234.170.42 Apple-iPhone4C1/902.179 200 0 64 3140491"

由於它是一個日志文件,因此正則表達式應該能夠處理任何類似類型的行。

在這種情況下,集合的首選輸出應為:

2012-05-15
00:49:02
192.168.100.10
/Microsoft-Server-ActiveSync/default.eas
User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_
443
redcloud\nikced
94.234.170.42
Apple-iPhone4C1/902.179
200
0
64
3140491

使用C#、. net和Regex欣賞任何答案,以將上述子字符串提取到集合中(首選MatchCollection)。 所有日志行都遵循相同的格式和模式。

令人難以置信的復雜正則表達式傳入:

logFile.Split(' ');

這將為您提供一個數組,您可以迭代該數組以檢索由空格分隔的所有“行”

string[] lines = log.Split(' ');

您不需要使用正則表達式。 您可以簡單地使用String.Split Method ,並將空格指定為分隔符:

  string [] substrings = line.Split(new Char [] {' '});

如果需要確定每個部分的種類,則應指定要查找的內容,然后可以為其創建正則表達式。

無論如何,如果您確實要使用正則表達式,請執行以下操作:

  Regex re = new Regex (@"(?:(?<s>[^ ]+)(?: |$))*");

當您調用Match方法時,這將為您提供“ s”組中的所有捕獲。

正如OP在評論中指出的那樣,分隔符可以是單個空格中的任意內容,因此可能的分隔符應包含在表達式的(?: |$)[^ ]部分中。 也就是說,如果空格和制表符是可能的分隔符,請用(?: |\\t|$)[^ \\t]替換該部分。 如果需要接受多個字符中的一個作為分隔符,請在()組后面添加一個+

  (?:(?<s>[^ \t]+)(?: |\t|$)+)*

最快和最明顯的方法是使用String.Split

string[] substrings = result = line->Split( nullptr, StringSplitOptions::RemoveEmptyEntries );

但是,如果您堅持使用MatchCollection那么它將滿足您的要求

MatchCollection ^ substrings = Regex.Matches(line, "\\S+")

確實,您只需要將其分解為幾個部分。

首先,日期。 會始終采用YYYY-MM-DD格式嗎? 根據地區/文化背景,可能會有所不同嗎?

(?<LogDate>dddd-dd-dd)

接下來,您有時間。 一樣:

(?<LogTime>dd:dd:dd)

接下來,我假設這是實際調用的Web方法? 不確定,因為您還沒有真正解釋數據的布局方式。 但是,我假設它要么是POST要么是GET,所以這就是我們下一步要做的...

(?<LogMethod>POST|GET)

只要對您感興趣的日志行的每個部分都執行此操作,就可以設置好了。 IE:

(?<LogDate>dddd-dd-dd) (?<LogTime>dd:dd:dd) (?<LogMethod>POST|GET)...

如果要錨定到行的開頭/結尾,請確保分別使用^和$。 當獲得Matches時,可以通過使用命名組(例如match.Groups["LogMethod"].Value )對Groups屬性進行索引來從每個組中獲取值。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM