[英]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#中,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.