簡體   English   中英

高級正則表達式-在替換中捕獲整個復雜的語句組

[英]Advanced Regex - Capture Whole Group of Complex Statement inside Replace

我正在一個項目上,我需要解析相關數據...我使用的工具完全基於命令,並返回所有內容,因此使用正則表達式非常方便,而不必猜測這行是這樣,並且另一個是這個,...所以我需要這樣解析:

1個QB 1283 / YR VC MC MO22AUG IFNTHR 2240 2335 100 0 S

取決於條件的形狀可能會出現在許多形狀上,但這有望實現:

.*((/)?(?<Class>(\\w{2}\\s+)+)(\\w{2}\\d{2}\\w{3})?\\s+\\w{6}).*

只是一個問題,我只需要捕獲這一部分: YR VC MC並且不能保證總是有三個...我嘗試了括號分組以及命名,正如您所看到的,我不知道如何捕獲C#中的一個組,盡管我認為它使用Regex-> Replace,然后將整個數據替換為所選的組(在“ Class”組中),但它僅與內部括號的最后一部分匹配。不是全部。 例如,在上一行中,它將返回“ MC”而不是其中的三個,我也嘗試將(\\w{2}\\s+)+)替換為(\\w{2}\\s+|\\w{2}\\s+\\w{2}\\s+|\\w{2}\\s+\\w{2}\\s+\\w{2}\\s+)但也沒有用。

有人可以幫助我解決這個問題嗎? 謝謝。

捕獲組

讓我們備份一下。 首先,我們需要了解什么是捕獲組 放在括號內的所有內容都將是一個捕獲組。 因此,例如,帶有字符串89的正則表達式(\\d)(\\d)將在第一組中捕獲8 ,在第二組中捕獲9 假設您將第二個數字設為可選,因此(\\d)(\\d?) 現在,如果您嘗試僅匹配8 ,則第一組將為8 ,第二組將為空字符串。 通過這種方式,我們可以匹配所有組,即使某些組“丟失”了。

非捕獲組

您的正則表達式似乎有很多不必要的捕獲組。 如果不需要,請不要使用括號。 例如,對於(/)? ,您只需刪除括號即可。 如果要匹配字符串“ 123”十次怎么辦? 您可能會做類似(123){10} 但是,這是另一個不需要的捕獲組! 您可以使用(?:)代替()來創建非捕獲組。 這樣,您將不會捕獲括號內的任何內容,但可以方便地有效使用括號。

您的正則表達式

從您的正則表達式中刪除所有不必要的捕獲組,我們最終得到:

.*/?(\w{2}\s+)+(?:\w{2}\d{2}\w{3})?\s+\w{6}.*.

其中包括捕獲組中的空間,所以讓我們來看看:

.*/?(\w{2})\s+(?:\w{2}\d{2}\w{3})?\s+\w{6}.*.

此時,捕獲組(\\w{2})僅與示例字符串中的MC匹配,因此讓我們執行操作並將其分成三個不同的捕獲組。 請注意,我們無法執行(\\w{2}){1,3} (它將匹配\\w{2}一到三倍),因為它仍然只有一組括號,因此只能有一個捕獲組。 因此,我們需要將(\\w{2})\\s+擴展為(\\w{2})\\s+(\\w{2})\\s+(\\w{2})\\s+ 此正則表達式將正確捕獲您的三個字符串。

C#中的正則表達式

在C#中,System.Text.RegularExpressions中有這個方便的Regex類。 這是您將如何使用它:

string regex = @".*/?(\w{2})\s+(\w{2})\s+(\w{2})\s+(?:\w{2}\d{2}\w{3})?\s+\w{6}.*";
string sample = "1 QB 1283 /YR VC MC MO22AUG IFNTHR 2240 2335 100 0 S";
Match matches = Regex.Match (sample, regex);
string[] stringGroups = matches.Groups
    .Cast<Group> ()
    .Select (el => el.Value)
    .ToArray ();

在這里,stringGroups將是一個包含所有捕獲組的字符串數組。 stringGroups [0]將是整個匹配項(因此,在這種情況下, 1 QB 1283 /YR VC MC MO22AUG IFNTHR 2240 2335 100 0 S ),stringGroups [1]將是第一個捕獲組(在這種情況下為YR ),stringGroups [ 2]第二個,stringGroups [3]第三個。

PS:我強烈建議使用Debuggex來測試這種類型的東西。

使其不貪心:

.*?((/)?(?<Class>(\w{2}\s+)+)(\w{2}\d{2}\w{3})?\s+\w{6}).*
  ^

或從兩端刪除兩個貪心點。 您不需要它們:

/?(?<Class>(?:\w{2}\s+)+)(?:\w{2}\d{2}\w{3})?\s+\w{6}

暫無
暫無

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

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