2010-08-16 38 views
0

我想將Perl腳本轉換爲C#3.5例程。Regex.split,如何閱讀匹配模式的左邊

Perl代碼我已經是:

if($work =~ /\<[0-9][0-9][0-9]\>/){ 
    $left  = $`; 
    $match  = $&; 
    $work  = $'; 
} 

在C#中我寫了下面的代碼:

string[] sSplit = Regex.Split(work, @"\<[0-9][0-9][0-9]\>"); 
if sSplit.length is > 2 
{ 
    left = sSplit[0]; 
    match = sSplit[1]; 
    work = sSPlit[2]; 
} 

但是上面不給我sSplit[1]匹配的模式,但內容相反的字符串的權利。

回答

4

Regex.Split不是你所需要的。相當於=~ /.../的是Regex.Match

然而,Regex.Match沒有等價於Perl的$`$',所以你需要使用一個解決辦法,但我認爲這是一個公平的:

var m = Regex.Match(work, @"^(.*?)(\<[0-9][0-9][0-9]\>)(.*)$", RegexOptions.Singleline); 
if (m.Success) 
{ 
    left = m.Groups[0].Value; 
    match = m.Groups[1].Value; // perhaps with Convert.ToInt32()? 
    work = m.Groups[2].Value; 
} 

或者,你可以使用匹配指數和長度得到的東西:

var m = Regex.Match(work, @"^\<[0-9][0-9][0-9]\>"); 
if (m.Success) 
{ 
    left = work.Substring(0, m.Index); 
    match = m.Value; // perhaps with Convert.ToInt32()? 
    work = work.Substring(m.Index + m.Length); 
} 
+0

你不想要麼太:Perl的行爲一樣的方式(不禁止的$&類型變量。)

你通過把周圍的括號捕獲的Perl delimters(*?)或(。*)都是?我只是想知道如果匹配的字符串重複出現,你想得到所有的匹配,他們的左右都是什麼,會發生什麼......雖然當我閱讀它時,這有點超出了這個問題的範圍。 – Chris 2010-08-16 15:21:38

+1

@Chris:第二個是「(。*?)」還是「(。*)」,因爲後面的「$」沒有區別。第一個是重要的:它是'(。*?)',以便您獲得第一個匹配。用'(。*)'你會得到最後一個。 – Timwi 2010-08-16 15:23:34

+0

大家好,非常感謝您的幫助! – Desai 2010-08-16 16:11:03

2

當嘗試正則表達式,我永遠電子書籍RegexHero,這是一個在線工具,可視化你的.NET正則表達式。在這種情況下,使用Regex.Match並使用組。這會給你想要的。

請注意,\<\>中的反斜槓在C#中(而不是Perl,btw中)不需要。

還要注意,當在替換表達式中使用時,$`,$&$'在C#中具有等同物。如果最終你需要這些,你可以使用這些「魔術變量」,但只能在Regex.Replace中使用。

1

A split通常要求將分隔符分開。上月底

my @parts = split /(<[0-9][0-9][0-9]>)/; # includes the delimiter 
my @parts = split /<[0-9][0-9][0-9]>/; # doesn't include the delimiter 
+0

s/verboten /不推薦/ – ysth 2010-08-16 16:29:48