2010-07-08 40 views
0

我有一個基本上是c風格的源文件的文本。我需要匹配一個特定的字符,只能在字符串外面說':'。例如:匹配c源代碼風格字符串以外的字符

void main() { 
    int x = rand() % 2; 
    printf(x ? "heads : tails" : "tails : heads"); 
    // I want to match this ---^ character, but not others 
} 

對於特異性起見,我使用正則表達式

回答

-1

的.NET風格可以用balancing groups,.NET正則表達式的深度跟蹤功能做到這一點。

+0

我想你也可以使用字符串分割方法,只有搜索字符串數組的奇數項返回。偶條目是你試圖避免的字符串文字。 – 2010-07-08 01:27:36

+0

字符串不能嵌套,因此不需要跟蹤深度。 – 2010-07-10 01:24:10

1

您可以使用正則表達式(如(:)|"[^"\r\n]*")匹配冒號或字符串。使用捕獲組來確定冒號是否匹配。迭代此正則表達式的匹配以處理冒號。

Regex regexObj = new Regex("(:)|\"[^\"\r\n]*\""); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    if (matchResult.Groups[1].Success) { 
     // Colon was matched 
    } 
    matchResults = matchResults.NextMatch(); 
} 

請注意,雖然此正則表達式在您的代碼示例上正常工作,但它通常不會在C#代碼上工作。正則表達式不處理包含轉義引號的字符串,不處理逐字字符串,也不會從註釋中排除冒號。如果你想所有你需要使用相同的原理展開正則表達式,如:

(:)|string|verbatim string|single line comment|multi line comment