2010-04-27 49 views
2

我需要使用正則表達式匹配*字符的第二個和隨後的出現。實際上,我使用替換法將其刪除之前,所以這裏的一些例子和後:使用正則表達式刪除重複的字符

test*  -> test* (no change) 
*test* -> *test 
test** *e -> test* e 

是否有可能用正則表達式來做到這一點? 感謝

回答

4

如果.NET可以看任意數量的背後應對,試圖用一個空字符串替換以下模式:

(?<=\*.*)\* 

PS Home:\> 'test*','*test*','test** *e' -replace '(?<=\*.*)\*','' 
test* 
*test 
test* e 

另一種方法是這樣的模式:

(?<=\*.{0,100})\* 

其中數字100可以與目標串的大小所替代。

和測試使用Mono 2.0以下:

using System; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    public static void Main() 
    { 
     Regex r = new Regex(@"(?<=\*.*)\*"); 
     Console.WriteLine("{0}", r.Replace("test*", ""));  
     Console.WriteLine("{0}", r.Replace("*test*", ""));  
     Console.WriteLine("{0}", r.Replace("test** *e", ""));       
    } 
} 

也產生:

test* 
*test 
test* e 
+0

第一個在.NET 4中工作。我沒有在先前的版本中測試過它。 – 2010-04-27 21:23:08

+0

增加了一個PowerShell概念驗證;第一個工作。 – Joey 2010-04-27 21:24:37

+0

@Johannes,歡呼聲。 PowerShell是否使用相同的正則表達式引擎? (是用.NET編寫的PowerShell?) – 2010-04-27 21:29:18

0

非最優的,但另一種方法。 記錄第一次出現的索引,替換所有出現的記錄,並將第一次出現重新插入記錄的索引處。

+0

好吧,使用正則表達式時所有背後的東西都不是最優的! :) – 2010-04-27 21:30:42

0
$str =~ s/\*/MYSPECIAL/; #only replace the first * 
$str =~ s/\*//g;   #replace all * 
$str =~ s/MYSPECIAL/\*/; #put * back 
+0

.NET語言是什麼?我在這裏錯過了什麼嗎? – Joey 2010-04-28 13:14:40

相關問題