2010-04-04 85 views
0

這是字符串「21xy5」的一部分。我想插入「*」,其間用空格隔開:數字和字母,字母和數字,字母和字母。我使用這個正則表達式模式「\ d [a-z] | [a-z] \ d | [a-z] [a-z]」來查找插入字符串「*」的索引。問題是,當字符串21xy5中的正則表達式OR(|)與21-x | x-y | y-5匹配時,第一個條件21-x成功,第二個x-y未被選中,第三個成功。所以我有21 * xy * 5而不是21 * x * y * 5。如果輸入字符串是這樣的xy21,那麼x-y成功,然後我有x * y21。問題是邏輯OR不是貪婪的。邏輯OR(正則表達式)問題不是貪婪

Regex reg = new Regex(@"\d[a-z]|[a-z]\d|[a-z][a-z]"); 
    MatchCollection matchC; 
    matchC = reg.Matches(input); 
    int ii = 1; 
    foreach (Match element in matchC) 
    { 
     input = input.Insert(element.Index + ii, " * "); 
     ii += 3; 
    } 
    return input; 

回答

1

你想看看。

Regex reg = new Regex(@"(\d(?=[a-z])|[a-z](?=[a-z\d]))"); 

(更換reg$1 *

你原來的正則表達式的問題是不貪,但它實際上會消耗2個字符。這意味着,當匹配1x時,只有y5將保留可用,因此正則表達式引擎無法看到xy。 OTOH,預見只是一個零寬度的斷言,所以下一個字符不會被消耗。例如而1x一起匹配\d(?=[a-z]),只有1將被消耗,因此xy5可用。

+0

Thx,我現在明白了。 – dontoo 2010-04-04 13:32:44